[英]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.