我做了一个简单的关系表。全部由三个表组成:
我想问的是我是否可以删除Table_PersonAddress
中的主键,以便Table_PersonAddress
没有主键,而剩下的只是personID
和{{1 }}?
下面是我建立的数据库关系的一个示例:
答案 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
。