SQLite中如何通过ALTER TABLE添加带默认NULL与外键约束的列?
在SQLite中添加带外键约束且默认值为NULL的列
嘿,我来帮你搞定这个问题!你遇到的问题其实是SQLite对ALTER TABLE ADD COLUMN语法的特定约束导致的——你原来的语句里用了FOREIGN KEY关键字,这在SQLite的ADD COLUMN语句里是不允许的,哪怕默认值是NULL也不行。下面给你分两种情况给出解决方案:
一、如果你的SQLite版本是3.35.0及以上(推荐方案)
从SQLite 3.35.0(2021年3月发布)开始,官方已经支持直接在ADD COLUMN语句中添加带外键约束的列,前提是新列的默认值为NULL。你只需要去掉多余的FOREIGN KEY关键字,直接用列级的REFERENCES约束即可:
ALTER TABLE Customers ADD COLUMN AddressID INTEGER DEFAULT NULL REFERENCES MasterAddress(AddressID);
⚠️ 注意:执行前请确保你的SQLite连接已经开启了外键支持,否则外键约束不会生效,可以先执行这条语句开启:
PRAGMA foreign_keys = ON;
二、如果你的SQLite版本低于3.35.0(变通方案)
要是你用的是比较旧的SQLite版本,不支持直接添加带外键的列,那就得用经典的“新建表+迁移数据”的方法,步骤如下:
创建包含新列和外键约束的新表
复制原表的所有列定义,再加上你要新增的带外键的列:CREATE TABLE Customers_new ( -- 这里复制原Customers表的所有列,比如: CustomerID INTEGER PRIMARY KEY, CustomerName TEXT NOT NULL, -- 新增的带外键约束的列 AddressID INTEGER DEFAULT NULL REFERENCES MasterAddress(AddressID), -- 原表的其他列... );迁移原表的数据到新表
把原表的所有数据插入到新表中,注意要匹配列名:INSERT INTO Customers_new (CustomerID, CustomerName /* 原表的其他列 */) SELECT CustomerID, CustomerName /* 原表的其他列 */ FROM Customers;替换原表
先把原表重命名为备份表,再将新表重命名为原表的名称:ALTER TABLE Customers RENAME TO Customers_old; ALTER TABLE Customers_new RENAME TO Customers;清理备份表(可选)
确认数据迁移无误后,可以删除备份表:DROP TABLE Customers_old;
内容的提问来源于stack exchange,提问作者Bruce Harold
相关产品推荐
相关产品推荐

