创建 sqlite3 表后添加 ON DELETE CASCADE 行为

问题描述 投票:0回答:2

创建表后是否可以添加

ON DELETE CASCADE
到表中?

我的架构如下:

CREATE TABLE skills(name varchar, skill varchar, level int, foreign key(name) references runners(name), primary key(name, skill));

如果外键被删除,我想级联。

sqlite ddl
2个回答
14
投票

SQLite 的

ALTER TABLE
命令 无法执行您想要的操作。

但是,可以绕过SQL解释器并直接更改内表定义。 SQLite 将表定义存储为其 CREATE TABLE

中的 sqlite_master
 命令的
文本
副本;查看此查询的结果:

SELECT sql FROM sqlite_master WHERE type='table' AND name='skills';

将级联规范添加到该字符串,然后使用

sqlite_master
 启用对 
PRAGMA writable_schema=1;
的写访问权限,并将新表定义写入其中:

UPDATE sqlite_master SET sql='...' WHERE type='table' AND name='skills';

然后重新打开数据库。

警告:这仅适用于不会更改表的磁盘格式的更改。如果您确实进行了任何更改记录格式的更改(例如添加/删除字段,或修改

rowid
),您的数据库将严重崩溃。


0
投票

建议的方法是使用该语句创建一个新表,然后复制数据,删除原始表并重命名新表。

这在ALTER TABLE 手册中进行了描述。

接受的答案中描述的方法 - 使用模式编辑 - 非常危险,如果 SQLite 连接是在 防御模式 下创建的,甚至是不可能的 - 正如它应该做的那样。)

© www.soinside.com 2019 - 2024. All rights reserved.