SQLite外键?

时间:2013-08-01 02:09:33

标签: sqlite

我有2个表:ABAB的外键,而B有[{1}}的外键。但我无法从AA制作外键,因为B之前会创建A

当SQLite不支持B时,如何解决?

这是我的示例数据库:

Alter Table

4 个答案:

答案 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)

我相信我之前通过在事务中创建表来完成它。如果它不起作用,我将删除这个答案。