【问题标题】:SQLite foreign key?SQLite 外键?
【发布时间】:2015-06-25 23:09:59
【问题描述】:

我有 2 张桌子:ABA 有一个到 B 的外键,B 有一个到 A 的外键。但是我不能创建从AB 的外键,因为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)
)

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    您有一个语法错误:表BFOREIGN KEY 之前缺少一个逗号。

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

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

    【讨论】:

    • 更正了缺少的逗号。
    【解决方案2】:

    我相信您的问题实际上是您如何定义外键。定义循环外键对我来说很好。试试这个查询:

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

    【讨论】:

    • 但是在这种情况下,当创建表'A'时,表'B'不存在..它怎么能引用B_ID??
    【解决方案3】:

    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)
    

    如果你需要给你的表添加约束,this question over here covers it

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-07-17
        • 1970-01-01
        • 2015-09-24
        • 2012-09-02
        • 1970-01-01
        • 2014-01-17
        • 2019-08-09
        • 1970-01-01
        相关资源
        最近更新 更多