我有一张包含学生信息的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
);
答案 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)