需要将属性限制为SQL

时间:2016-03-28 12:20:13

标签: mysql sql database netbeans

我有3个表REVIEW,PAPER和PCMEMBER,它的代码如下所述:

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成员和#34;进行审核。不确定我应该使用什么CHECK约束?我只需要这个来创建表格。感谢

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

创建:

  • 一面旗帜PAPER.reviewed DEFAULT 0
  • 插入/更新触发器以防止客户端更改标记
  • 触发REVIEW自动设置(取消设置)PAPER.reviewed标记,当相关论文(尚未)正好有三个评论者时(更新两者:OLD.paper_id和NEW.paper_id)< / LI>
  • 触发REVIEW,以防止每篇论文超过三位审稿人。

<强>更新

创建触发器的示例(在插入时防止每张纸超过3个评论者)

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 ;