2016-03-28 102 views
1

屬性限制爲3個值我有3代表審查,紙張和PCMEMBER和代碼是如下提到:需要在SQL

CREATE TABLE REVIEW(
due_date DATE NOT NULL, 
review_date DATE NOT NULL, 
recommendation VARCHAR(50) NOT NULL, 
comment VARCHAR(50) NOT NULL, 
pcmem_id NUMBER(10) NOT NULL, 
paper_id NUMBER(10) NOT NULL, 
CONSTRAINT review_pk PRIMARY KEY (pcmem_id,paper_id), 
CONSTRAINT review_fk FOREIGN KEY(paper_id) 
REFERENCES PAPER(paper_id), 
CONSTRAINT review_fk1 FOREIGN KEY(pcmem_id) 
REFERENCES PCMEMBER(pcmem_id)); 

CREATE TABLE PCMEMBER(
pcmem_id NUMBER(10) NOT NULL PRIMARY KEY, 
pc_fname VARCHAR(20) NOT NULL, 
pc_sname VARCHAR(20) NOT NULL, 
pc_title VARCHAR (20) NOT NULL, 
pc_position VARCHAR(20) NOT NULL, 
affiliation VARCHAR(20) NOT NULL, 
pc_email VARCHAR(20) NOT NULL, 
track_id NUMBER(6) NOT NULL, 
CONSTRAINT pcmember_fk FOREIGN KEY(track_id) 
REFERENCES TRACK(track_id)); 

CREATE TABLE PAPER(
paper_id NUMBER(10) PRIMARY KEY NOT NULL, 
paper_title VARCHAR(20) NOT NULL, 
abstract VARCHAR(50) NOT NULL, 
paper_type VARCHAR(20) NOT NULL, 
submission_date DATE NOT NULL, 
track_id NUMBER(6) NOT NULL, 
CONSTRAINT paper_fk FOREIGN KEY(track_id) 
REFERENCES TRACK(track_id), 
CONSTRAINT chk_type CHECK(paper_type IN ('full paper','Research-in-Progress','posters')), 
); 

我想添加一個條件,其中「每論文將由恰好3位PC成員審覈「。不確定我應該使用哪些CHECK約束?我只是需要這個創建表。謝謝

+1

您正在使用'與MySQL check'約束(防止每紙超過3層的評論上插入件)。你知道MySQL不強制執行它們嗎? –

+0

嗨,戈登,是的,我知道它。想知道是否有其他方法可以解決這個問題?觸發器? –

+0

對於'paper_type',您可以使用'enum'或更好的引用'paper_types'表的FK。 –

回答

1

創建:

  • 標誌PAPER.reviewed DEFAULT 0
  • 插入/更新觸發客戶端
  • 觸發器REVIEW防止標誌更改爲全自動設置(撤消)PAPER.reviewed標誌時的相關文件已經(還沒有)完全三個審閱者(在更新爲:OLD.paper_id和NEW.paper_id)
  • 觸發器REVIEW以防止每個論文有三個以上的審閱者。

更新

實施例用於創建觸發

DELIMITER // 
CREATE TRIGGER `chck_pcmem` AFTER INSERT ON `review` FOR EACH ROW BEGIN 
    IF ((SELECT COUNT(1) FROM review WHERE paper_id = NEW.paper_id) > 3) THEN 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Only 3 PC members per paper'; 
    END IF; 
END// 
DELIMITER ; 
+0

Hi paul,謝謝你的回覆。我試圖找出上述的觸發器聲明。嘗試後,我能夠得到這樣的: CREATE TRIGGER chck_pcmem檢討 AFTER INSERT AS IF EXISTS(SELECT COUNT(pcmem_id)> 3評分) BEGIN( '每篇論文只有3 PC成員。') RAISERROR; END GO 是對不起? –

+0

我添加了一個創建觸發器的例子。我建議使用像HeidiSQL這樣的工具來創建觸發器,然後導出它們。 –

+0

完美!非常感謝你的幫助保羅! –

2

我看到的問題是,在一些點(S)你不會有3個審閱者。當你添加第一個(三個)時,你只會有一個。您可以嘗試確保您的應用程序始終一次添加三個,但這似乎比它的價值更麻煩。

我的建議是通過您的應用程序強制執行此操作,並可能在表格中插入一個觸發器以防止添加超過三個。在大多數SQL變體中,您可以通過計算列和約束的組合來完成此操作,但正如Gordon指出的那樣,MySQL不強制執行它們。