簡體   English   中英

如何正確聲明外鍵?

[英]How do I declare a foreign key correctly?

SQL 錯誤 [42601]:錯誤:“foreign”處或附近的語法錯誤

我放置外鍵的每個實例都會引發錯誤

我嘗試用外鍵創建一個表,除了列和表的名稱外,我做的和 geeksforgeeks 完全一樣

CREATE TABLE Estate
(
Main_Heating_System_ID int foreign key references Heating_System(HID), 
Address varchar(255) NOT null primary key,
EstateSize int NOT NULL,
);

CREATE TABLE Heating_System
(
HID int primary key, 
Address varchar(255) foreign key references Estate(Address),
kW int NOT NULL,
);

CREATE TABLE neighbouring
(
Estate_Address varchar(255) FOREIGN key references Estate(Address),
Neighbour_Address varchar(255) foreign key references Estate(Address),
);

正如@jarlh 所說,在您嘗試創建表期間,您不使用關鍵字 FOREIGN KEY 在與列名和類型相同的行上聲明它們(僅當通過 ADD CONSTRAINT 進行時)。 如果您從每行中刪除兩個單詞 FOREIGN KEY,它應該可以工作

編輯:再看一遍,我不確定您的數據 model 的設計。

使用這些外鍵,您不能插入 Estate 表,除非您插入的記錄引用 Heating_System 表中的 HID。 但是,如果您首先嘗試插入到 Heating_System 表中,則不能,除非您引用的地址已經存在於 Estate 表中。

在我看來,Heating_System 表上的地址字段可能是不必要的。 如果每個 Estate 都有一個供暖系統,並且供暖系統的地址只是其所在庄園的地址,則應從 Heating_System 表中刪除地址字段。 您仍然可以查詢供暖系統關聯的地址(通過其 Estate),例如

SELECT h."HID", 
       e."Address" 
  FROM Heating_System h
  JOIN Estate e ON h."HID" = e."Main_Heating_System_ID"

您甚至可以為此創建一個視圖,但您應始終避免復制數據 model(表)中的信息。 我建議學習一下數據庫規范化(1NF、2NF、3NF)以了解更多信息

此外,通常避免在表名和列名中使用大寫字符。 修改您的名字以反映這一點可能會讓您省去一些麻煩。

作為另一個不相關的提示,如果地址有可能超過 255 個字符,您可能需要考慮在地址字段中使用類型文本而不是 varchar(255)

暫無
暫無

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

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