表定义中的参照完整性检查

时间:2013-07-20 17:49:20

标签: sql database oracle ddl

我有一张包含学生信息的STUDENTS表格。每个学生在大学投票活动中可能是CANDIDATE,也可能不是CANDIDATE BIT,具体取决于VOTE的价值。

我希望有一张表VOTES_FOR来保留学生的选票,但是我想检查一下CANDIDATE插入的学生是否真的是{{1} } 或不。用简单的英语:检查被投票的人是否真的是候选人。

有关如何检查此约束的任何想法?我想使用简单的常规DDL命令而非存储过程和PL / SQL或T-SQL

来完成此任务
CREATE TABLE STUDENTS(
    ID INT NOT NULL UNIQUE AUTO_INCREMENT = 1,
    FIRST_NAME NVARCHAR(20) NOT NULL ,
    LAST_NAME NVARCHAR(20) NOT NULL,
    CANDIDATE BIT DEFAULT '0',
    PRIMARY KEY(ID)
);    
CREATE TABLE VOTE(
    STUDENT_ID references STUDENTS(ID),
    VOTES_FOR references STUDENTS(ID),
    PRIMARY KEY STUDENT_ID
);

4 个答案:

答案 0 :(得分:2)

正在寻找针对此类问题的DDL解决方案。

我会努力加入候选人表格。 我的理由是,这将允许您宣布独特的特征,例如开始和结束候选资格时间,这将使学生能够在下一年或更晚的时候成为候选人。

此外,这会为您提供该候选人的ID。

CREATE TABLE student {
    id INTEGER PRIMARY KEY,
    fname VARCHAR(20) NOT NULL,
    lname VARCHAR(20) NOT NULL
};

CREATE TABLE candidate {
    id INTEGER PRIMARY KEY,
    student_id INTEGER(11) NOT NULL,
    start_year INTEGER(4) NOT NULL,
    start_month INTEGER(2) NOT NULL,
    start_day INTEGER(2) NOT NULL,
    end_year INTEGER(4) NULL,
    end_month INTEGER(2) NULL,
    end_day INTEGER(2) NULL
}

CREATE TABLE vote {
    student_id INTEGER(11) NOT NULL,
    candidate_id INTEGER(11) NOT NULL
};

答案 1 :(得分:2)

在“ID”和“CANDIDATE”列上声明一个UNIQUE约束,并从“VOTES”表中引用该对。在“VOTES”中使用CHECK约束来保证仅为候选人记录投票。

CREATE TABLE STUDENTS(
    ID INTEGER PRIMARY KEY,
    FIRST_NAME VARCHAR2(20) NOT NULL,
    LAST_NAME VARCHAR2(20) NOT NULL,
    CANDIDATE CHAR(1) DEFAULT 'f' NOT NULL 
      CHECK (CANDIDATE IN ('t', 'f')),
    UNIQUE (ID, CANDIDATE)
);

CREATE TABLE VOTES(
    STUDENT_ID INTEGER PRIMARY KEY
      REFERENCES STUDENTS (ID),
    VOTES_FOR INTEGER NOT NULL,
    CANDIDATE CHAR(1) DEFAULT 't' 
      CHECK (CANDIDATE = 't'),
    FOREIGN KEY (VOTES_FOR, CANDIDATE)
      REFERENCES STUDENTS (ID, CANDIDATE)
);

“IS_CANDIDATE”可能是比“CANDIDATE”更好的名字; “CANDIDATE_ID”可能是一个比“VOTES_FOR”更好的名字。

答案 2 :(得分:1)

如果你正在使用Oracle和数据库,你想要查看Ref Constraint这里的例外Ref Constraint Example

虽然情况可能比Oracle约束允许的情况稍微复杂一些。由Tony Andrews撰写的这篇文章为实现您期望的结果提供了一种巧妙的解决方法。

答案 3 :(得分:0)

您是否尝试过使用SQL CHECK约束?

http://www.w3schools.com/sql/sql_check.asp

您将需要一个复合外键来提供您想要的支票。