1

我有一张STUDENTS包含学生信息的表格。每个学生可能会或可能不会CANDIDATE参加大学投票活动,具体取决于CANDIDATE BIT.

我想要一张VOTE保存学生投票的表格,但我想检查被插入的学生VOTES_FOR是否实际上是 a CANDIDATE。用简单的英语:检查被投票的人是否真的是候选人。

关于如何检查此约束的任何想法?我想使用简单的常规 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

4 回答 4

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
};
于 2013-07-20T19:01:35.183 回答
2

声明对列“ID”和“CANDIDATE”的唯一约束,并从表“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”更好的名称。

于 2013-07-20T21:23:19.527 回答
1

如果您使用的是 Oracle 和您想要查看Ref 约束的数据库,这里有一个示例Ref 约束示例

尽管情况可能比 Oracle 约束所允许的要复杂一些。这篇由Tony Andrews撰写的文章提供了一种巧妙的解决方法来实现您想要的结果。

于 2013-07-20T19:15:36.243 回答
0

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

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

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

于 2013-07-20T18:04:12.583 回答