【问题标题】:What if a table doesn't have a primary key如果表没有主键怎么办
【发布时间】:2019-12-24 00:19:34
【问题描述】:

我做了一个简单的关系表。全部由三个表组成:

  1. 用于存储个人数据的表 (Table_Person)
  2. 用于存储地址数据的表(Table_Address)
  3. 存储Table_Person和Table_Address(Table_PersonAddress)关系的表。

我想问的是我可以删除Table_PersonAddress中的主键,这样Table_PersonAddress就没有主键,剩下的就是personIDaddressID吗?

以下是我创建的数据库关系示例:

enter image description here

【问题讨论】:

    标签: sqlite database-design foreign-keys


    【解决方案1】:

    假设您没有在联结表(即仅存储人员与其地址之间的关系的第三个表)上设置任何外键约束,您可以从第一个表,同时留下第三个表中的关系。但是,仅仅因为您可以做到这一点,并不意味着您愿意。大多数情况下,如果您从第一个表中删除一个人,您还希望从第三个表中删除他的所有关系。在 SQLite 中执行此操作的一种方法是在创建第三个表时向第三个表添加级联删除约束:

    CREATE TABLE Table_PersonAddress (
        ...
        CONSTRAINT fk_person
        FOREIGN KEY (personID)
        REFERENCES Table_Person (ID)
        ON DELETE CASCADE
    )
    

    您可能还想为第三个表中的地址字段添加类似的约束,因为删除地址也会使涉及该地址的所有关系无效。

    请注意,SQLite 不允许将级联删除约束添加到已存在的表中。您必须以某种方式重新创建表才能添加这些约束。

    【讨论】:

      【解决方案2】:

      您可以删除它,但我的建议是为personIDaddressID 两列设置一个复合 PRIMARY KEY,因此保证每一行都是UNIQUE

      PRIMARY KEY (personID, addressID)
      

      请记住,在 SQLite 中,您始终拥有 rowid 列,以便在需要时将其用作行的 id。
      所以用这个语句创建表:

      DROP TABLE IF EXISTS PersonAddress;
      CREATE TABLE PersonAddress (
          personID    INTEGER,
          addressID   INTEGER,
          PRIMARY KEY(personID, addressID),
          FOREIGN KEY (personID) REFERENCES Person (personID) ON DELETE CASCADE,
          FOREIGN KEY (addressID) REFERENCES Address (addressID) ON DELETE CASCADE
      );
      

      还有一件事:为什么将personIDaddressID 定义为TEXT
      当然,SQLite 在数据类型定义上一点也不严格,但由于它们引用的列是 INTEGER,它们也应该是 INTEGER

      【讨论】:

      • 谢谢您,先生,我会尝试您的建议。我将该数据类型定义为 TEXT 是因为这只是一个示例,所以我定义了 TEXT 数据类型。我想问的是关联我已经问过的上表。
      • 是的,我已经听从了您的建议,它正在工作。谢谢。
      猜你喜欢
      • 2021-07-29
      • 2012-07-06
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2019-11-03
      相关资源
      最近更新 更多