2013-06-24 44 views
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。

非常感謝,

Froskoy。

+1

我不認爲MySQL支持這種約束... – fthiella

回答

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; 

...?

+2

關閉,但我認爲'(SELECT COUNT(值isPrimary)FROM TELEPHONENUMBERS WHERE值isPrimary = 1 AND TELEPHONENUMBERS.membershipnumber =會員編號)> 1' – We0

+0

噢,當然!好眼睛。改變答案。 – neokio

+0

如果你喜歡,請給我一個投票;) – We0

1

有兩件事是錯在你的方法:

  1. 檢查約束不能包含(而不是在5.5反正)

子查詢

  • 檢查約束不是由MySQL執行一下就可以了做,是創建一個引發錯誤的觸發器。這裏有一個例子:

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

  • +0

    真棒 - 謝謝 - 我會給觸發器的例子去我的結果,當我得到它的工作。 – Froskoy