创建表后是否可以添加
ON DELETE CASCADE
到表中?
我的架构如下:
CREATE TABLE skills(name varchar, skill varchar, level int, foreign key(name) references runners(name), primary key(name, skill));
如果外键被删除,我想级联。
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
),您的数据库将严重崩溃。
建议的方法是使用该语句创建一个新表,然后复制数据,删除原始表并重命名新表。
这在ALTER TABLE 手册中进行了描述。
接受的答案中描述的方法 - 使用模式编辑 - 非常危险,如果 SQLite 连接是在 防御模式 下创建的,甚至是不可能的 - 正如它应该做的那样。)