MySQL вставить и выбрать между 3 таблицами - PullRequest
0 голосов
/ 26 сентября 2019

Я ищу лучший способ справиться со следующей проблемой.

custData
--------
ID | Code
1  |  A
2  |  B

prodData
--------
ID | ProdID
1  | prodA
2  | prodB
3  | prodC

, и я хотел бы сохранить запись в этой таблице:

custProdPrice
--------
ID | Cust | Prod
 1 |  A   | prodA
 2 |  A   | prodB
 3 |  A   | prodC
 4 |  B   | prodA
 5 |  B   | prodB
 6 |  B   | prodC

я ее получалсделано с помощью следующего запроса

create view  CashPOSDB.viewertable as select Code, ProdID as pid, BelongTo
from CashPOSDB.custData cross join CashPOSDB.prodData

AND

insert into CashPOSDB.custProdPrice(Cust, Prod, BelongTo)(select Code, Pid, BelongTo from
(select Code, pid, belongTo from CashPOSDB.viewertable UNION ALL
select Cust, Prod, BelongTo from CashPOSDB.custProdPrice) t group by Code, Pid); 

Он выполняет свою работу, но иногда кажется, что он пропускает какой-то результат или вставляет повторяющиеся строки.

Кроме того, я хотел бы проверить это так, чтобыкогда я вставляю новый Prod prodD, он проверяет custProdPrice и проверяет, есть ли в Cust A и B строка

A | prodD
b | prodD  

, и вставляет его, если он не существует.

Итак, как лучше всего это оптимизировать?

1 Ответ

0 голосов
/ 26 сентября 2019

Дайте таблице custProdPrice уникальный индекс на (Cust, Prod) для предотвращения дублирования:

ALTER TABLE custProdPrice ADD UNIQUE INDEX (Cust, Prod);

Затем используйте INSERT IGNORE для пропуска дубликатов.

Кажется, что нетпо любой причине UNION с custProdPrice при вставке в custProdPrice.Просто вставьте перекрестное произведение.

INSERT IGNORE INTO CashPOSDB.custProdPrice (Cust, Prod, BelongTo)
SELECT Cust, Prod, BelongTo
FROM CashPOSDB.viewertable

Чтобы автоматически добавлять новые строки в custProdPrice, используйте триггер:

CREATE TRIGGER addCustProdPrice
AFTER INSERT ON prodTable
FOR EACH ROW
    INSERT IGNORE INTO custProdPrice (Cust, Prod, BelongTo)
    SELECT c.Cust, NEW.Prod, NEW.BelongTo
    FROM custData;
...