我可以在 SQL 中创建同一列的外键和主键吗?
Can I create a foreign key and primary key of the same column in SQL?
我想从 (STDNO & CORSNO) 列为 Enrollment table 创建一个复合主键,它们也是来自 Student 和 Course tables 的外键,但它一直在提供我的错误。也,同样的事情发生在学生table我需要让每个学生都属于一个部门。
这是我所做的:
CREATE TABLE Student
(
STDNO number(8),
SNAME varchar2(30) NOT NULL,
DEPTNO varchar(2),
CONSTRAINT PK_Studnet PRIMARY KEY(STDNO,DEPTNO),
FOREIGN KEY(DEPTNO) REFERENCES Department(DEPTNO)
);
CREATE TABLE Department
(
DEPTNO varchar2(2) PRIMARY KEY,
DNAME varchar2(20)
);
CREATE TABLE Course
(
CORSNO number(3) PRIMARY KEY,
CNAME varchar2(30),
DETNO varchar2(30),
CMAX number(2)
);
CREATE TABLE Enrolment
(
STDNO number(8),
CORSNO number(3),
GRADE number(2),
EDATE date date default CURRENT_TIMESTAMP,
CONSTRAINT PK_Enrolment PRIMARY KEY (STDNO, CORSNO),
FOREIGN KEY(STDNO) REFERENCES Student(STDNO),
FOREIGN KEY(CORSNO) REFERENCES Course(CORSNO)
);
一个PRIMARY KEY
应该唯一标识它所代表的事物;在学生的情况下,我们可以假设学号对于该学生来说应该是唯一的并且应该是主键(因为假设您不会向两个学生发出相同的学号不同的部门)。
如果您更改代码,使 STUDNO
单独成为 PRIMARY KEY
并重新排列 table 的顺序,以便在之前创建引用的 table引用它们的 tables 然后你得到:
CREATE TABLE Department
(
DEPTNO varchar2(2) PRIMARY KEY,
DNAME varchar2(20)
);
CREATE TABLE Course
(
CORSNO number(3) PRIMARY KEY,
CNAME varchar2(30),
DETNO varchar2(30),
CMAX number(2)
);
CREATE TABLE Student
(
STDNO number(8),
SNAME varchar2(30) NOT NULL,
DEPTNO varchar(2),
CONSTRAINT PK_Studnet PRIMARY KEY(STDNO),
FOREIGN KEY(DEPTNO) REFERENCES Department(DEPTNO)
);
CREATE TABLE Enrolment
(
STDNO number(8),
CORSNO number(3),
GRADE number(2),
EDATE date default CURRENT_TIMESTAMP,
CONSTRAINT PK_Enrolment PRIMARY KEY (STDNO, CORSNO),
FOREIGN KEY(STDNO) REFERENCES Student(STDNO),
FOREIGN KEY(CORSNO) REFERENCES Course(CORSNO)
);
(同时修复 Enrolment
table 中 date date
的错字。)
然后 Enrolment
table 中的约束起作用,因为每个引用约束都引用了唯一的东西。之前,您曾说过学号和院系的组合是唯一的,但您试图仅引用学号,而学号本身并不是唯一的。
db<>fiddle here
我想从 (STDNO & CORSNO) 列为 Enrollment table 创建一个复合主键,它们也是来自 Student 和 Course tables 的外键,但它一直在提供我的错误。也,同样的事情发生在学生table我需要让每个学生都属于一个部门。
这是我所做的:
CREATE TABLE Student
(
STDNO number(8),
SNAME varchar2(30) NOT NULL,
DEPTNO varchar(2),
CONSTRAINT PK_Studnet PRIMARY KEY(STDNO,DEPTNO),
FOREIGN KEY(DEPTNO) REFERENCES Department(DEPTNO)
);
CREATE TABLE Department
(
DEPTNO varchar2(2) PRIMARY KEY,
DNAME varchar2(20)
);
CREATE TABLE Course
(
CORSNO number(3) PRIMARY KEY,
CNAME varchar2(30),
DETNO varchar2(30),
CMAX number(2)
);
CREATE TABLE Enrolment
(
STDNO number(8),
CORSNO number(3),
GRADE number(2),
EDATE date date default CURRENT_TIMESTAMP,
CONSTRAINT PK_Enrolment PRIMARY KEY (STDNO, CORSNO),
FOREIGN KEY(STDNO) REFERENCES Student(STDNO),
FOREIGN KEY(CORSNO) REFERENCES Course(CORSNO)
);
一个PRIMARY KEY
应该唯一标识它所代表的事物;在学生的情况下,我们可以假设学号对于该学生来说应该是唯一的并且应该是主键(因为假设您不会向两个学生发出相同的学号不同的部门)。
如果您更改代码,使 STUDNO
单独成为 PRIMARY KEY
并重新排列 table 的顺序,以便在之前创建引用的 table引用它们的 tables 然后你得到:
CREATE TABLE Department
(
DEPTNO varchar2(2) PRIMARY KEY,
DNAME varchar2(20)
);
CREATE TABLE Course
(
CORSNO number(3) PRIMARY KEY,
CNAME varchar2(30),
DETNO varchar2(30),
CMAX number(2)
);
CREATE TABLE Student
(
STDNO number(8),
SNAME varchar2(30) NOT NULL,
DEPTNO varchar(2),
CONSTRAINT PK_Studnet PRIMARY KEY(STDNO),
FOREIGN KEY(DEPTNO) REFERENCES Department(DEPTNO)
);
CREATE TABLE Enrolment
(
STDNO number(8),
CORSNO number(3),
GRADE number(2),
EDATE date default CURRENT_TIMESTAMP,
CONSTRAINT PK_Enrolment PRIMARY KEY (STDNO, CORSNO),
FOREIGN KEY(STDNO) REFERENCES Student(STDNO),
FOREIGN KEY(CORSNO) REFERENCES Course(CORSNO)
);
(同时修复 Enrolment
table 中 date date
的错字。)
然后 Enrolment
table 中的约束起作用,因为每个引用约束都引用了唯一的东西。之前,您曾说过学号和院系的组合是唯一的,但您试图仅引用学号,而学号本身并不是唯一的。
db<>fiddle here