我的专栏是这样的。专栏" a"是主要和自动增量。
a | b | x | y
插入新数据时,我需要检查x和y列是否应该一起存在。
为了澄清,假设这一行在数据库中具有这些值
(2, "example.com" , "admin", "123456")
我应该能够插入这两列
(3, "example.com" , "user", "123456")
(4, "example2.com" , "admin", "123456")
但我不能插入此专栏
(5, "example.com" , "admin", "5555555")
因为" example.com"和" admin"一行中已存在于数据库中的值。列并不重要" y"是否相同。
我该怎么做?
答案 0 :(得分:3)
创建复合唯一索引。这将允许各个字段中的任意数量的重复,但组合必须是唯一的。 CREATE UNIQUE INDEX ix_uq ON tablename(b,x);
...如果未违反唯一索引,则使用INSERT IGNORE进行插入。如果是,请忽略插入。
INSERT IGNORE INTO test(a,b,x,y)VALUES(5,“example.com”,“admin”,“5555555”);
如果你想插入除非有重复,并且有更新,你也可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE;
参考:MySQL only insert new row if combination of columns (which allow duplicates) is unique
答案 1 :(得分:1)
您想让数据库完成工作。虽然您可以在查询中设置条件,但该条件可能不是普遍适用,或者某人可能使用其他查询。
数据库可以使用唯一约束或索引来检查它。实际上,唯一约束是使用唯一索引实现:
create unique index unq_t_b_x on t(b, x);
(列可以按任意顺序排列。)
插入符如下:
insert into t(b, x, y)
values ('example.com', 'admin', '5555555')
on duplicate key update b = values(b);
请注意,更新中不包含自动递增的值。
on duplicate key update
只会阻止insert
生成错误。它优于insert ignore
,因为后者会忽略所有错误,而您只想忽略由重复键引起的错误。