我可以在 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