插入数据库并检查是否存在

时间:2019-09-03 07:30:21

标签: mysql insert

我有两个桌子

  

表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)

我知道它是不正确的,但这是我尝试解决此问题的尝试

1 个答案:

答案 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);

不要抱怨,只需更新已经存在的内容即可。