2013-08-01 97 views
5

我有2个表格:ABA有一个外键到BB有一个外键到A。但是我不能在AB之间设置外键,因为A是在B之前创建的。SQLite外键?

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

回答

1

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

+0

谢谢!!我来试试.. –

4

我相信你的问题实际上是你如何定义你的外键。定义圆形外键对我来说工作得很好。试试这个查询,而不是:

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 
); 
+1

但在这种情况下,当表“A”创建表' B'不存在..它如何使B_ID参考? –

10

你有一个语法错误:有一个逗号表BFOREIGN KEY前失踪。

否则,您的模式是正确的。 (SQLite的将只在需要时解释REFERENCES条款,所以没有问题,创建一个表的引用不存在。)

请注意,插入记录将是有问题的,除非你插入记录与NULL值首先在引用记录存在时稍后更新它们。 创建deferred foreign key constraints可能是一个更好的主意。

+0

更正了缺少的逗号。 – monojohnny

2

Sqlite 确实支持ALTER TABLE,但在有限的能力。

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

The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a 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