我有两个桌子
表A
ID | Prod_ID | Prod_Name | Price1 | Price2 |Price3
表B
ID | Cust_ID | CUST_NAME
表C
ID | Cust_ID | Prod_ID | Price1 | Price2 | Price3
我现在遇到的问题是现在有一种方法,但是只要在tableA中有一个新的插入,它将像下面这样检查表C中是否已经有与表B相关的行
如果我有以下数据,请说
1 | prodA | candy | 1 | 2 | 3
2 | prodB | towel | 2 | 3 | 3
1 | CustA | ccc
2 | CustB | dddd
1| custA | prodA | 1 | 2 | 3
2| custA | prodB | 2 | 3 | 3
3| custB | prodA | 1 | 2 | 3
4| custB | prodB | 2 | 3 | 3
因此,当我插入价格为4、4、4的新商品调用“杯子”时,它将首先 插入表A
1 | prodA | candy | 1 | 2 | 3
2 | prodB | towel | 2 | 3 | 3
3 | prodC | cup | 4 | 4 | 4
表c变为
1| custA | prodA | 1 | 2 | 3
2| custA | prodB | 2 | 3 | 3
3| custB | prodA | 1 | 2 | 3
4| custB | prodB | 2 | 3 | 3
5| custA | prodC | 4 | 4 | 4
6| custB | prodC | 4 | 4 | 4
我可以简单地通过每次删除表C中的所有元素并创建新记录来做到这一点,但是由于表B中的价格仅为参考价/标准价,因此产品价格可能会根据客户而有所不同,以后对每个客户的调整都会很小,所以我将无法删除整个表并创建新表。
我想知道是否有一种简单的方法可以执行以下操作: A)每当创建新产品时,请检查表C中是否已将该产品分配给所有客户,否则,请插入缺少的产品
B)每当创建新客户时,请检查并查看注册了哪些产品并将所有产品分配给该新客户到表C中
我已经尝试过类似的事情
insert ignore into tableC (tableC.Cust, tableC.Prod)
select tableA.custID, tableB.prodID from tableA cross join tableB
where not exists(select tableC.Cust = tableA.custID
and tableC.Prod = tableB.prodID)
我知道它是不正确的,但这是我尝试解决此问题的尝试
答案 0 :(得分:0)
简化模型
drop table if exists t;
create table t
(cid int, pid int, p1 int,
key tk1(cid),
unique key tu1 (cid,pid));
insert into t values
(1,1,1),(2,2,20);
按预期插入。
您希望第二次插入失败
insert into t values
(1,1,1);
确实如此
ERROR 1062 (23000): Duplicate entry '1-1' for key 'tu1'
请注意,它无法使用复合唯一键
如果您
insert into t values
(1,1,30)
on duplicate key update cid = values(cid);
不要抱怨,只需更新已经存在的内容即可。