使用 REFERENCES 创建两个表

问题描述

我正在阅读一本 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)