执行SQLite alter table技巧时更新外键引用

qlvxas9a  于 2023-06-23  发布在  SQLite
关注(0)|答案(3)|浏览(123)

在SQLite FAQ[1]中提到,SQLite没有完全的ALTER TABLE支持。在之前关于StackOverflow [2]的问题中,提到了一个完成表修改的技巧。
我想知道的是如何保留FOREIGN KEY引用,因为这些引用被移动到重命名的表,随后被删除。我是否应该对每个与我正在修改的实际表有外键关系的表执行同样的技巧?
[1][http://www.sqlite.org/lang_altertable.html](http://www.sqlite.org/lang_altertable.html)
[2][How do I rename a column in a SQLite database table?](https://stackoverflow.com/questions/805363/how-do-i-rename-a-column-in-a-sqlite-database-table)

oxosxuxt

oxosxuxt1#

使用当前版本的SQLite,当使用PRAGMA foreign_keys=OFF禁用外键处理时,不会重写其他表中的引用约束。
不能说这种行为在2011年是否有所不同。

rbl8hiat

rbl8hiat2#

是的,你需要做同样的“把戏”。重命名被引用表时,外键约束仍以新名称引用该表。由于SQLite不支持“DROP CONSTRAINT”,因此您还必须使用更正后的外键约束重新构建引用表。
事实上,在纠正外键引用之前,您将无法删除旧表。只要PRAGMA foreign_keys=ON;,SQLite3就不会让您删除仍然有外键引用它的表。

kcrjzv8t

kcrjzv8t3#

帮助我的诀窍:

alter table some RENAME to some_old;
CREATE TABLE IF NOT EXISTS some (.....)
insert into some select * from some_old;
DROP TABLE IF EXISTS some_old;
alter table some RENAME to some_old;
alter table some_old rename to some;

在这个序列之后,外键指向some而不是some_old

相关问题