0

我有一个 2 表模式,可以按如下方式指定:

CREATE TABLE MEMBERS
( membershipnumber int NOT NULL PRIMARY KEY,
firstname varchar(20) NOT NULL,
lastname varchar(20) NOT NULL,
email varchar(30) NOT NULL,
status varchar(15) NOT NULL DEFAULT 'unapproved',
);

CREATE TABLE TELEPHONENUMBERS
( telephone varchar(15) NOT NULL PRIMARY KEY,
membershipnumber INT NOT NULL REFERENCES MEMBERS(membershipnumber),
isprimary enum('0','1') NOT NULL DEFAULT '1'
);

我试图指定一个完整性约束以表明任何个人成员可能只有一个主要电话号码(即telephonenumbers.isprimary='1')和任意数量的辅助电话号码。

这是我目前的尝试:

ALTER TABLE MEMBERS
ADD CONSTRAINT oneprimary_ck CHECK (SELECT COUNT(isprimary)=1 FROM TELEPHONENUMBERS WHERE TELEPHONENUMBERS.membershipnumber = membershipnumber) IN '1';

但是,这会产生以下语法错误:

 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT COUNT(isprimary)=0 FROM TELEPHONENUMBERS WHERE TELEPHONENUMBERS.membershipnumber=1 IN '1') IN ''

我假设我的方法完全错误,但不确定如何继续。使用触发器来执行此操作会更好,还是对我的方法进行一些小的改动会起作用?

我正在使用服务器版本:5.5.30。

非常感谢,

弗罗斯科伊。

4

2 回答 2

1

您的方法有两件事是错误的:

  1. 检查约束不能包含子查询
  2. MySQL 不强制执行检查约束(无论如何在 5.5 中都没有)

您可以做的是创建一个引发错误的触发器。这是一个例子:

https://stackoverflow.com/a/7189396/417194

于 2013-06-24T14:25:45.013 回答
1

换了会不会好点...

ALTER TABLE MEMBERS ADD CONSTRAINT oneprimary_ck CHECK
(SELECT COUNT(isprimary)=1 FROM TELEPHONENUMBERS
 WHERE TELEPHONENUMBERS.membershipnumber = membershipnumber) IN '1';

... 和 ...

ALTER TABLE MEMBERS ADD CONSTRAINT oneprimary_ck CHECK
(SELECT COUNT(isprimary) FROM TELEPHONENUMBERS
 WHERE isprimary=1 AND TELEPHONENUMBERS.membershipnumber = membershipnumber) > 1;

... ?

于 2013-06-24T14:13:27.297 回答