Sequelize如何修改现有表的外键约束为ON DELETE CASCADE?
解决方案
1. 查询外键约束名的两种方法
- 方法1:通过SQLite系统查询直接获取
你可以直接执行以下SQL语句拿到Analyses表的所有外键约束信息:
-- 先查询表的所有外键配置 PRAGMA foreign_key_list('Analyses'); -- 找到对应endpointId关联Endpoints.id的记录后,执行以下语句拿到约束名 SELECT sql FROM sqlite_master WHERE type='table' AND name='Analyses';
返回的建表SQL中CONSTRAINT后面紧跟着的就是对应外键的约束名。
- 方法2:直接使用Sequelize默认生成的约束名
Sequelize创建外键时默认命名规则为{表名}_{字段名}_foreign_key,你的场景下约束名大概率是Analyses_endpointId_foreign_key,可以直接尝试使用。
2. 正确的迁移脚本写法
SQLite不支持直接通过ALTER COLUMN修改外键规则,必须先删除原有外键约束,再新增带CASCADE规则的新约束,完整迁移脚本如下:
module.exports = { up: async (queryInterface, Sequelize) => { // 先删除原有外键约束 await queryInterface.removeConstraint('Analyses', 'Analyses_endpointId_foreign_key'); // 新增带ON DELETE CASCADE的外键约束 await queryInterface.addConstraint('Analyses', { fields: ['endpointId'], type: 'foreign key', name: 'Analyses_endpointId_foreign_key', // 保持约束名一致也可以自定义 references: { table: 'Endpoints', field: 'id' }, onDelete: 'CASCADE', onUpdate: 'CASCADE' }); }, down: async (queryInterface, Sequelize) => { // 回滚时先删除CASCADE规则的外键 await queryInterface.removeConstraint('Analyses', 'Analyses_endpointId_foreign_key'); // 加回原NO ACTION规则的外键 await queryInterface.addConstraint('Analyses', { fields: ['endpointId'], type: 'foreign key', name: 'Analyses_endpointId_foreign_key', references: { table: 'Endpoints', field: 'id' }, onDelete: 'NO ACTION', onUpdate: 'CASCADE' }); } };
注意事项
如果执行删除约束时报错,说明默认的约束名不对,用方法1的查询语句拿到真实约束名替换即可。
内容的提问来源于stack exchange,提问作者Tsvetelin
相关产品推荐
相关产品推荐

