如果表没有主键怎么办

时间:2019-08-18 14:38:21

标签: sqlite database-design foreign-keys

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

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

我想问的是我是否可以删除Table_PersonAddress中的主键,以便Table_PersonAddress没有主键,而剩下的只是personID和{{1 }}?

下面是我建立的数据库关系的一个示例:

enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

您可以删除它,但是我的建议是为id name NewValue 09 abc 0009 0098 de 00098 987 j 000987 00056 i 00056 6 z 0006 0908 u 000908 99999999 u 00099999999 7522323838483 i 0007522323838483 PRIMARY KEY两列设置一个 composite personID addressID

UNIQUE

并且请记住,在SQLite中,您总是拥有rowid列,以在需要时将其用作行的ID。
因此,使用以下语句创建表:

PRIMARY KEY (personID, addressID)

还有一件事:为什么将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 ); personID定义为addressID
当然,SQLite对数据类型的定义并不严格,但是由于它们引用的列是TEXT,因此它们也应该是INTEGER