2011-04-07 67 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