【问题标题】:Have constraints such that foreign key is in table 1 is not foreign key in table 2有约束使得表 1 中的外键不是表 2 中的外键
【发布时间】:2020-07-29 23:23:25
【问题描述】:

我有一个表 Property,现在有两个表 Rent 和 sale,每个表都有 property_id 作为外键。我如何保证 Rent 中的任何 property_id 都不能在销售中重复?如果是这样,MySQL 应该会抛出一个错误。

这是 Rent Table,与 Sale 完全相同

CREATE TABLE Rent
(
  /*some data*/
  Property_id INT NOT NULL,
  PRIMARY KEY (Property_id),
  FOREIGN KEY (Property_id) REFERENCES Property(Property_id) ON DELETE CASCADE
);

【问题讨论】:

  • 这是一个常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。

标签: mysql sql database-design foreign-keys


【解决方案1】:

您可以使用带有鉴别器列的单个表

例子

CREATE TABLE property (
    id   INT AUTO_INCREMENT,
    name VARCHAR(255),
    /* some data */
    PRIMARY KEY (id)
);

CREATE TABLE contract (
    id          INT AUTO_INCREMENT,
    property_id INT NOT NULL,
    type        VARCHAR(32) CHECK ( type IN ('rent', 'sale') ),
    PRIMARY KEY (id),
    FOREIGN KEY (property_id)
        REFERENCES property(id) ON DELETE CASCADE
);

CREATE TABLE Rent (
    id            INT AUTO_INCREMENT,
    /* some data */
    contract_id   INT NOT NULL,
    contract_type VARCHAR(32) CHECK ( contract_type = 'rent'),
    PRIMARY KEY (id),
    FOREIGN KEY (contract_id)
        REFERENCES contact(id) ON DELETE CASCADE
);

CREATE TABLE Sale (
    id            INT AUTO_INCREMENT,
    /* some data */
    contract_id   INT NOT NULL,
    contract_type VARCHAR(32) CHECK ( contract_type = 'sale'),
    PRIMARY KEY (id),
    FOREIGN KEY (contract_id)
        REFERENCES contact(id) ON DELETE CASCADE
);

【讨论】:

  • 什么是更好的选择,有一个单独的表合同或在属性表内有一个合同列类型?
  • 两者都可以。这实际上取决于您的数据模型。不过,对于大多数用例,我可能更喜欢合同表。
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
相关资源
最近更新 更多