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

Mysql 插入到数据库中并检查是否存在,mysql,insert,Mysql,Insert,我有两张桌子 表A 表B 表C 我现在遇到的问题是,现在有一个方法,而每当有一个新的插入到表a中时,它就会检查表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| cus

我有两张桌子

表A

表B

表C

我现在遇到的问题是,现在有一个方法,而每当有一个新的插入到表a中时,它就会检查表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
因此,当我插入一个名为“cup”的新项目,价格为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)
我知道这是不对的,但那是我试图解决这个问题的一个简化模型

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

不要抱怨,简单地更新已经存在的内容就可以了。

对于我昨天给出的关于这个主题的答案,您不喜欢/得到哪些方面?@p.Salmon因为tableC中的那些键不是唯一的,因此使用重复键检查可能不起作用?或者可以将custID和prodID都设置为键吗?谢谢你的支持reply@P.Salmon通过使用交叉连接,我可以解决插入tableC的问题,但我忘记了不时更新价格,因此我不能简单地删除整个记录集并插入新记录。是的,您可以在一个唯一的表中有多个列key@P.Salmon但让我们在表C中说,如果我有custA和prodA,prodB,custB和prodA,prodB,我会用“on duplicate”检查查询?这将检查是否有重复从两列?这应该是工作,如果我必须更新的东西,但我不认为它会工作,如果我创造新的产品。如果我创建了一个prodC,我需要检查表中的每个客户(custA、custB、custC…),看看它是否有一个prodC关联,所以我必须看看custA | prodC、custB | prodC、custC | prodC是否已经在表中,如果没有插入,这是我昨天关于添加触发器的观点回答-你熟悉触发器吗?如果没有读到这篇文章,我会先看看触发器,我以前从未使用过它,谢谢你的建议
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);