当前位置:  开发笔记 > 前端 > 正文

如何将外键添加到现有SQLite表?

如何解决《如何将外键添加到现有SQLite表?》经验,为你挑选了3个好方法。

我有下表:

CREATE TABLE child( 
  id INTEGER PRIMARY KEY, 
  parent_id INTEGER, 
  description TEXT);

如何添加外键约束parent_id?假设启用了外键.

大多数示例假设您正在创建表 - 我想将约束添加到现有表中.



1> Daniel Vassa..:

你不能.

虽然向表中添加外键的SQL-92语法如下:

ALTER TABLE child ADD CONSTRAINT fk_child_parent
                  FOREIGN KEY (parent_id) 
                  REFERENCES parent(id);

SQLite不支持该命令的ADD CONSTRAINT变体ALTER TABLE(sqlite.org:SQLite未实现的SQL功能).

因此,在sqlite 3.6.1中添加外键的唯一方法是在CREATE TABLE以下期间:

CREATE TABLE child ( 
    id           INTEGER PRIMARY KEY, 
    parent_id    INTEGER, 
    description  TEXT,
    FOREIGN KEY (parent_id) REFERENCES parent(id)
);

不幸的是,您必须将现有数据保存到临时表,删除旧表,使用FK约束创建新表,然后从临时表中复制数据.(sqlite.org - FAQ:Q11)


我认为重命名旧表,创建新表并将数据复制回来更容易.然后你可以删除旧表.
如果其他表引用了这个表,请不要重命名旧表,如第一个注释中所述!在这种情况下,您还必须重新创建所有这些表.
不应该是:FOREIGN KEY(parent_id)REFERENCES parent(id)True,Jonathan没有给出"父表"的名称.事实上,表应该命名为person,但是......
这对我来说似乎是个大问题.通常在转储数据库时,首先导出CREATE TABLE命令.然后INSERT INTO命令,最后是ADD CONSTRAINT命令.如果数据中存在循环(外键值)依赖关系,则在强制执行外键时无法插入数据.但是如果你以后不能添加外键约束,那么你就会陷入困境.当然有延迟约束,但这非常笨拙.

2> Jorge Novaes..:

如果更改表并添加使用约束的列,则可以添加约束.

首先,创建没有parent_id的表:

CREATE TABLE child( 
  id INTEGER PRIMARY KEY,  
  description TEXT);

然后,改变表格:

ALTER TABLE child ADD COLUMN parent_id INTEGER REFERENCES parent(id);


习惯了这一顺序很不错,但这并不能回答实际的问题:*我想将约束添加到现有约束中。

3> situee..:

请查看https://www.sqlite.org/lang_altertable.html#otheralter

SQLite直接支持的唯一模式更改命令是上面显示的"重命名表"和"添加列"命令.但是,应用程序可以使用简单的操作序列对表的格式进行其他任意更改.对某些表X的模式设计进行任意更改的步骤如下:

    如果启用了外键约束,请使用PRAGMA foreign_keys = OFF禁用它们.

    开始交易.

    记住与表X关联的所有索引和触发器的格式.下面的步骤8中将需要此信息.一种方法是运行如下查询:SELECT类型,sql FROM sqlite_master WHERE tbl_name ='X'.

    使用CREATE TABLE构造一个新表"new_X",它具有表X所需的修订格式.当然,确保名称"new_X"不会与任何现有的表名冲突.

    使用如下语句将内容从X传输到new_X:INSERT INTO new_X SELECT ... FROM X.

    删除旧表X:DROP TABLE X.

    使用以下命令将new_X的名称更改为X:ALTER TABLE new_X RENAME TO X.

    使用CREATE INDEX和CREATE TRIGGER重建与表X关联的索引和触发器.也许使用上面步骤3中保存的触发器和索引的旧格式作为指导,进行适当的更改以进行更改.

    如果任何视图以受模式更改影响的方式引用表X,则使用DROP VIEW删除这些视图,并使用CREATE VIEW以适应模式更改所需的任何更改重新创建它们.

    如果最初启用了外键约束,则运行PRAGMA foreign_key_check以验证架构更改未破坏任何外键约束.

    提交在步骤2中启动的事务.

    如果最初启用了外键约束,请立即重新启用它们.

上面的过程是完全通用的,即使模式更改导致存储在表中的信息发生更改,它也会起作用.因此,上面的完整过程适用于删除列,更改列的顺序,添加或删除UNIQUE约束或PRIMARY KEY,添加CHECK或FOREIGN KEY或NOT NULL约束,或更改列的数据类型等.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有