需要在SQL

问题描述:

属性限制为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。 –

创建:

  • 标志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

完美!非常感谢你的帮助保罗! –

我看到的问题是,在一些点(S)你不会有3个审阅者。当你添加第一个(三个)时,你只会有一个。您可以尝试确保您的应用程序始终一次添加三个,但这似乎比它的价值更麻烦。

我的建议是通过您的应用程序强制执行此操作,并可能在表格中插入一个触发器以防止添加超过三个。在大多数SQL变体中,您可以通过计算列和约束的组合来完成此操作,但正如Gordon指出的那样,MySQL不强制执行它们。