5

我有 2 张桌子:AB. A有一个外键到B并且B有一个外键到A。但我不能从Ato制作外键B,因为A是之前创建的B

SQLite 不支持时如何解决Alter Table

这是我的示例数据库:

Create Table A(
  A_ID    INTEGER PRIMARY KEY,
  B_ID    INTEGER,
  A_DESCRIPTION    TEXT,

  FOREIGN KEY (B_ID) REFERENCES B(B_ID)
)

Create Table B(
  B_ID    INTEGER PRIMARY KEY,
  A_ID    INTEGER,
  B_DESCRIPTION    TEXT,

  FOREIGN KEY (A_ID) REFERENCES A(A_ID)
)
4

4 回答 4

10

FOREIGN KEY您有一个语法错误:在 table之前缺少一个逗号B

否则,您的架构是正确的。(SQLite 将REFERENCES仅在需要时解释子句,因此创建对尚不存在的表的引用没有问题。)

请注意,插入记录会有问题,除非您NULL先插入带有值的记录,然后在引用的记录存在时更新它们。创建延迟外键约束可能是一个更好的主意。

于 2013-08-01T08:16:00.693 回答
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
);
于 2013-08-01T02:36:27.330 回答
2

Sqlite确实支持ALTER TABLE,但容量有限。

从文档(http://www.sqlite.org/lang_altertable.html):

SQLite 中的ALTER TABLE命令允许用户重命名表或向现有表添加新列。无法重命名列、删除列或在表中添加或删除约束。

由于您没有对外键使用约束,因此您可以先创建两个表,然后稍后使用ALTER TABLE ADD查询添加外键,这是 SQLite 附带的少数更改表命令之一。

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)

如果您需要向表中添加约束,这里的这个问题将涵盖它

于 2013-12-16T05:13:02.860 回答
1

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

于 2013-08-01T02:14:48.393 回答