簡體   English   中英

我可以在SQL中創建同一列的外鍵和主鍵嗎?

[英]Can I create a foreign key and primary key of the same column in SQL?

我想從 (STDNO & CORSNO) 列為 Enrollment 表創建一個復合主鍵,它們也是來自 Student 和 Course 表的外鍵,但它一直給我錯誤。 同樣,學生表中也發生了同樣的事情,我需要讓每個學生都屬於一個部門。

這是我所做的:

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並重新排列表的順序,以便在引用它們的表之前創建引用的表,那么您將得到:

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表中有date date的錯字。)

然后Enrolment表中的約束起作用,因為每個引用約束都引用唯一的東西。 之前,您曾說過學號和系的組合是唯一的,但您試圖僅引用學號本身並不是唯一的。

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM