我有一个简单的MYSQL表,其中包含以下列:
first | second
first
和second
是整数。表的主键是
PRIMARY KEY (`first`,`second`)
所以这只允许一个独特的值组合,如:
first | second
1 | 2
2 | 1
但是这个键也为两列接受相同的值。例如:
first | second
1 | 1
有没有办法使用MYSQL强制两个值不同。在插入数据库之前,我可以用PHP检查,但我想知道MYSQL中是否有办法实现它?
答案 0 :(得分:2)
PRIMARY KEY或UNIQUE约束不能强制执行此限制。
不幸的是,MySQL没有强制执行CHECK CONSTRAINTS,这是我们可能在其他数据库中使用的。
要让MySQL强制执行这样的约束,您需要实现BEFORE INSERT
和BEFORE UPDATE
触发器。
触发器主体中的“技巧”是检测您想要限制的条件,例如
IF (NEW.first = NEW.second) THEN
然后让触发器抛出错误。在MySQL的最新版本中,提供SIGNAL
语句来引发异常。在旧版本的MySQL中,您将运行一个会抛出错误的语句(例如,对已知不存在的表名执行SELECT。)
<强>后续强>
IF
语句仅在MySQL存储程序的上下文中有效(例如,PROCEDURE,FUNCTION或TRIGGER)。
要获得INSERT语句本身应用的这种限制,没有约束或触发器,我们需要使用INSERT语句的INSERT ... SELECT
形式。
例如:
INSERT INTO `mytable` (`first`, `second`)
SELECT t.first, t.second
FROM ( SELECT '1' AS `first, '1' AS `second`) t
WHERE t.first <> t.second
由于SELECT语句不返回任何行,因此不会向表中插入任何行。
请注意,此方法仅对此声明应用限制;这不会阻止某些其他会话执行不强制执行此限制的INSERT。要将此限制作为“数据库”的约束强制执行,您需要实现我在前面的答案中描述的BEFORE INSERT和BEFORE UPDATE触发器。