2011-04-07 105 views
16

這應該是一個相當直接的問題,但我無法找到一個簡單的答案。你如何創建一個也是MySQL主鍵的外鍵?這是我目前的嘗試:如何創建也是MySQL主鍵的外鍵?

CREATE TABLE Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id), 
    discount DOUBLE, 
    type VARCHAR(255), 
    price DOUBLE, 
    ); 

CREATE TABLE Normal_Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id); 
); 

CREATE TABLE Special_Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id); 
); 

我在這裏錯過了什麼?

在此先感謝。

+3

這種設計看起來不正確。對我來說,您似乎可以在Sale中添加一個字段,將其標記爲正常或特殊。這種味道 – 2011-04-07 02:07:42

+0

你正在過度規範化模式。正如Joe Phillips所說,存在一個更簡單的解決方案。您的設計可能會導致頭痛,因爲這兩個州應該是相互排斥的(正常的或特殊的),是什麼阻止銷售被記錄爲您的架構中的特殊和正常? *代碼*,你說?而已;這是你不需要的頭痛。 – 2011-04-07 02:18:52

+3

這些只是虛擬示例。問題不是設計問題,而是技術問題。 – user456584 2013-03-07 16:22:48

回答

35

添加FOREIGN KEY (sale_id) REFERENCES Sale(sale_id)每個外部表:

CREATE TABLE Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id), 
    discount DOUBLE, 
    type VARCHAR(255), 
    price DOUBLE 
) ENGINE=INNODB; 

CREATE TABLE Normal_Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id), 
    FOREIGN KEY (sale_id) REFERENCES Sale(sale_id) 
) ENGINE=INNODB; 

CREATE TABLE Special_Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id), 
    FOREIGN KEY (sale_id) REFERENCES Sale(sale_id) 
) ENGINE=INNODB; 

只要確保你的數據庫是InnoDB支持外國引用。

+1

這回答我的問題。謝謝! – user456584 2011-04-19 21:43:29