繁体   English   中英

插入前MySQL检查2值已经存在

[英]MySQL check 2 values already exists before insert

我的专栏是这样的。 “ 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”相同与否无关紧要。

我怎样才能做到这一点?

创建一个复合唯一索引。 这将允许在各个字段中进行任意数量的重复,但是组合必须是唯一的。 创建唯一索引ix_uq ON表名(b,x);

...并在不违反唯一索引的情况下使用INSERT IGNORE插入。 如果是,则忽略插入。

插入IGNORE测试(a,b,x,y)值(5,“ example.com”,“ admin”,“ 5555555”);

如果要插入,除非有重复项,否则要进行更新,也可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE;

参考: MySQL仅在列组合(允许重复)唯一时插入新行

您想让数据库完成工作。 尽管您可以在查询中设置条件,但该条件可能并非普遍成立,否则有人可能会使用其他查询。

数据库可以使用唯一约束或索引进行检查。 实际上,唯一约束是使用唯一索引实现的:

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更好,因为后者将忽略所有错误,而您只想忽略由重复键引起的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM