问题描述
我正在阅读一本 dbms 的书,我得到了这个约束示例:
CREATE TABLE Students (
sid CHAR(20),name CHAR(20),login CHAR(20),age INTEGER,honors CHAR(10) NOT NULL,gpa REAL,PRIMARY KEY (sid),FOREIGN KEY (honors) REFERENCES Courses(cid)
);
CREATE TABLE Courses (
cid CHAR(10),cname CHAR(10),credits INTEGER,grader CHAR(20) NOT NULL,PRIMARY KEY (cid),FOREIGN KEY (grader) REFERENCES Students(sid)
);
如何将 FK 约束设置为 DEFERRED,以便创建这些表?
解决方法
外键关系不允许前向引用。所以在创建第二个表后添加第一个:
CREATE TABLE Students (
sid CHAR(20),name CHAR(20),login CHAR(20),age INTEGER,honors CHAR(10) NOT NULL,gpa REAL,PRIMARY KEY (sid)
);
CREATE TABLE Courses (
cid CHAR(10),cname CHAR(10),credits INTEGER,grader CHAR(20) NOT NULL,PRIMARY KEY (cid),FOREIGN KEY (grader) REFERENCES Students(sid)
);
ALTER TABLE students ADD FOREIGN KEY (honors) REFERENCES Courses(cid);
注意:我强烈建议您对字符串使用 VARCHAR()
。通常你不想处理尾随空格。
此外,通常首选整数主键(通过 generated always as identity
列)。
这是修改后的外键约束查询
CREATE TABLE Students (
sid CHAR(20),PRIMARY KEY (sid),);
CREATE TABLE Courses (
cid CHAR(10),FOREIGN KEY (grader) REFERENCES Students(sid)
);
ALTER TABLE Students ADD CONSTRAINT FOREIGN KEY (honors) REFERENCES Courses(cid)