我有2个表:A
和B
。 A
有B
的外键,而B
有[{1}}的外键。但我无法从A
到A
制作外键,因为B
之前会创建A
。
当SQLite不支持B
时,如何解决?
这是我的示例数据库:
Alter Table
答案 0 :(得分:10)
您遇到语法错误:表FOREIGN KEY
中的B
之前缺少逗号。
否则,您的架构是正确的。
(SQLite仅在需要时解释REFERENCES
子句,因此创建对尚不存在的表的引用没有问题。)
请注意,插入记录会有问题,除非您首先插入具有NULL
值的记录,并在引用记录存在时更新它们。
创建deferred foreign key constraints可能是个更好的主意。
答案 1 :(得分:5)
我相信您的问题实际上是您如何定义外键。定义圆形外键对我来说效果很好。请尝试此查询:
pragma foreign_keys=on;
Create Table A(
A_ID INTEGER PRIMARY KEY,
B_ID INTEGER REFERENCES B(B_ID),
A_DESCRIPTION TEXT
);
Create Table B(
B_ID INTEGER PRIMARY KEY,
A_ID INTEGER REFERENCES A(A_ID),
B_DESCRIPTION TEXT
);
答案 2 :(得分:2)
Sqlite 确实支持ALTER TABLE
,但容量有限。
从文档(http://www.sqlite.org/lang_altertable.html):
SQLite中的
ALTER TABLE
命令允许用户重命名表或 将新列添加到现有表。无法重命名 列,删除列,或从表中添加或删除约束。
由于您没有对外键使用约束,因此可以先创建两个表,然后再使用ALTER TABLE ADD
查询添加外键,这是SQLite附带的少数alter table命令之一。
CREATE TABLE A(
ID INTEGER PRIMARY KEY,
A_DESCRIPTION TEXT
)
CREATE TABLE B(
ID INTEGER PRIMARY KEY,
B_DESCRIPTION TEXT
)
ALTER TABLE A ADD FOREIGN KEY B_ID B(ID)
ALTER TABLE B ADD FOREIGN KEY A_ID A(ID)
如果您需要为表添加约束,this question over here covers it
答案 3 :(得分:1)
我相信我之前通过在事务中创建表来完成它。如果它不起作用,我将删除这个答案。