MYSQL主键组合2个唯一且值不一样的

时间:2014-09-25 13:49:31

标签: mysql sql

我有一个简单的MYSQL表,其中包含以下列:

first | second

firstsecond是整数。表的主键是

PRIMARY KEY  (`first`,`second`)

所以这只允许一个独特的值组合,如:

first | second
  1   |   2
  2   |   1

但是这个键也为两列接受相同的值。例如:

first | second
  1   |   1

有没有办法使用MYSQL强制两个值不同。在插入数据库之前,我可以用PHP检查,但我想知道MYSQL中是否有办法实现它?

1 个答案:

答案 0 :(得分:2)

PRIMARY KEY或UNIQUE约束不能强制执行此限制。

不幸的是,MySQL没有强制执行CHECK CONSTRAINTS,这是我们可能在其他数据库中使用的。

要让MySQL强制执行这样的约束,您需要实现BEFORE INSERTBEFORE 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触发器。

相关问题