MySQL类断言约束

MySQL类断言约束,mysql,sql,assertions,Mysql,Sql,Assertions,我是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_numb

我是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
中,我需要一个特定的
卡号最多可以出现2次

如果没有断言,我如何管理它


谢谢。

这张桌子上肯定有插入前触发器的味道:“来宾”:

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,则将卡号设置为空。由于卡号被声明为非空,这将拒绝插入


在MySQL 5.1.41-3ubuntu12.10(Ubuntu Lucid)上测试并运行良好

是的。。。但是,如果你提出一个例外,说你已经有2个在那里,难道不是更好,而不是默默地失败去做用户要求的事情吗?我们不会默默地失败!insert查询本身失败(带有“card_number cannot NULL”),这可以在代码级别捕获,然后针对DB执行。好的,我看到它给出了反馈。谁会因为mysql的非酸性属性而抱怨没有使用触发器来模拟约束呢?是的。您发送一个查询,如
INSERT-INTO-guest-VALUES(…)从您的编程语言(PHP、C#等等)中获取。在所有这些语言中,您都可以检查MySQL错误代码和错误消息。如果您的查询因宾客人数>2而失败,您将收到错误代码
1048
和错误消息
“卡号”列不能为空”
-这是您的明确反馈。确定。那回滚呢?我可以使用它吗?当前没有SQL产品支持
创建断言
:(不是我上次查看的内容:在中确认为未实现,但在中未提及?