MySQL断言样的约束

3

我是一个MySQL新手,我刚刚发现它不支持断言。

我有这张表:

   CREATE TABLE `guest` (
   `ssn` varchar(16) NOT NULL,
   `name` varchar(200) NOT NULL,
   `surname` varchar(200) NOT NULL,
   `card_number` int(11) NOT NULL,
   PRIMARY KEY (`ssn`),
   KEY `card_number` (`card_number`),
   CONSTRAINT `guest_ibfk_1` FOREIGN KEY (`card_number`) REFERENCES `member` (`card_number`) 
   ) 

我需要的是一个会员最多可以邀请2个客人。所以,在guest表中,我需要特定的card_number最多只能出现2次。
我如何在不使用断言的情况下管理它?
谢谢。

目前没有任何 SQL 产品支持 CREATE ASSERTION :( - onedaywhen
不是我上次查看的时候:在7.3文档中确认为未实现,但在9.1文档中没有提及? - onedaywhen
1个回答

3

这明显是在表'guest'上添加之前触发器的结果:

DELIMITER $$
DROP TRIGGER IF EXISTS check_guest_count $$
CREATE TRIGGER check_guest_count BEFORE INSERT ON `guest`
  FOR EACH ROW BEGIN
    DECLARE numguests int DEFAULT 0;
    SELECT COUNT(*) INTO numguests FROM `guest` WHERE card_number=NEW.card_number;
    if numguests>=2 THEN
      SET NEW.card_number = NULL;
    END IF;
  END;
$$
DELIMITER ;

这基本上是查找当前客人数量,如果已经大于等于2,则将card_number设置为NULL。由于card_number被声明为NOT NULL,因此这将拒绝插入。

在MySQL 5.1.41-3ubuntu12.10(Ubuntu Lucid)上测试并可行。


是的...但是抛出异常来表示已经有两个在里面会比默默地失败更好,以此来满足用户的要求。 - Ben
好的,我明白它会给出反馈。那么对于那些抱怨不使用触发器来模拟约束的人呢?因为 MySQL 不符合 ACID 属性。 - user1146045
1
好的。ROLLBACK怎么样?我可以使用它吗? - user1146045
无论如何,它能工作。谢谢你。如果可以的话,我会给你一个“向上箭头”的。 - user1146045
@EugenRieck,抱歉;我没有在表格上看到“not null”。 - Ben
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接