【问题标题】:How to create foreign key that is also a primary key in MySQL?如何在MySQL中创建也是主键的外键?
【发布时间】:2011-04-07 01:50:37
【问题描述】:

这应该是一个相当简单的问题,但我找不到简单的答案。你如何创建一个外键同时也是 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);
);

我在这里错过了什么?

提前致谢。

【问题讨论】:

  • 这个设计看起来不对。对我来说,您似乎可以在 Sale 中添加一个字段,将其标记为 Normal 或 Special。这味道
  • 您对架构进行了过度规范化。正如 Joe Phillips 所说,存在一个更简单的解决方案。您的设计可能会让人头疼,因为这两种状态应该是互斥的(正常或特殊),是什么阻止了销售在您的模式中被记录为特殊和正常? 代码,你说?就是这样;那是你不需要的头痛。
  • 这些只是虚拟示例。这个问题不是设计问题,而是技术问题。

标签: mysql inheritance foreign-keys primary-key


【解决方案1】:

将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。

【讨论】:

  • 感谢您将此视为技术问题。只是我需要的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2015-02-03
  • 2015-03-08
  • 2010-10-22
  • 1970-01-01
  • 2013-09-09
相关资源
最近更新 更多