删除父级时 Sequelize orphan removal
Sequelize orphan removal when deleting parent
我在 mysql 中有两个表:
create table comments
(
id int unsigned auto_increment primary key,
postId varchar(100) not null,
text text not null,
constraint commentForPost foreign key (postId) references posts (id)
);
create table post
(
id varchar(100) not null primary key,
name varchar(100) not null,
);
和后续的两个模型:
post.js 文件:
class Post extends Model {}
Post.init({
// Model attributes are defined here
id: {
type: DataTypes.STRING,
primaryKey: true
},
name: {
type: DataTypes.STRING,
}
}, {
// Other model options go here
sequelize, // We need to pass the connection instance
modelName: 'Post', // We need to choose the model name
tableName: 'posts',
timestamps: false
});
Post.hasMany(Comment, { foreignKey: 'postId', onDelete: 'CASCADE'})
Comment.belongsTo(Post, { foreignKey: 'postId' });
comment.js 文件:
class Comment extends Model {}
Comment.init({
// Model attributes are defined here
id: {
type: DataTypes.STRING,
primaryKey: true
},
postId: {
type: DataTypes.STRING,
allowNull: false
},
text: {
type: DataTypes.text,
allowNull: false
}
}, {
// Other model options go here
sequelize, // We need to pass the connection instance
modelName: 'Comment', // We need to choose the model name
tableName: 'comments',
timestamps: false
});
现在我想在删除post的同时删除post的评论。我使用的代码如下:
const post = await Post.destroy({
where: {id}
});
这会生成以下查询:
DELETE FROM `posts` WHERE `id` = '1'
我得到的错误如下:
UnhandledPromiseRejectionWarning: SequelizeForeignKeyConstraintError:
Cannot delete or update a parent row: a foreign key constraint fails
(db
.comments
, CONSTRAINT commentForPost
FOREIGN KEY (postId
)
REFERENCES posts
(id
))
我的sequelize版本是:6.3.5
我怎样才能删除 post 并同时删除“孤立”评论?
您指定了 onDelete: 'CASCADE'
,此选项将有效,但仅适用于 sequelize.sync
调用(使用此选项创建外键)。通常的 destroy
调用不会考虑此选项。所以你应该手动更改现有的外键来设置 ON DELETE CASCADE
.
我在 mysql 中有两个表:
create table comments
(
id int unsigned auto_increment primary key,
postId varchar(100) not null,
text text not null,
constraint commentForPost foreign key (postId) references posts (id)
);
create table post
(
id varchar(100) not null primary key,
name varchar(100) not null,
);
和后续的两个模型: post.js 文件:
class Post extends Model {}
Post.init({
// Model attributes are defined here
id: {
type: DataTypes.STRING,
primaryKey: true
},
name: {
type: DataTypes.STRING,
}
}, {
// Other model options go here
sequelize, // We need to pass the connection instance
modelName: 'Post', // We need to choose the model name
tableName: 'posts',
timestamps: false
});
Post.hasMany(Comment, { foreignKey: 'postId', onDelete: 'CASCADE'})
Comment.belongsTo(Post, { foreignKey: 'postId' });
comment.js 文件:
class Comment extends Model {}
Comment.init({
// Model attributes are defined here
id: {
type: DataTypes.STRING,
primaryKey: true
},
postId: {
type: DataTypes.STRING,
allowNull: false
},
text: {
type: DataTypes.text,
allowNull: false
}
}, {
// Other model options go here
sequelize, // We need to pass the connection instance
modelName: 'Comment', // We need to choose the model name
tableName: 'comments',
timestamps: false
});
现在我想在删除post的同时删除post的评论。我使用的代码如下:
const post = await Post.destroy({
where: {id}
});
这会生成以下查询:
DELETE FROM `posts` WHERE `id` = '1'
我得到的错误如下:
UnhandledPromiseRejectionWarning: SequelizeForeignKeyConstraintError: Cannot delete or update a parent row: a foreign key constraint fails (
db
.comments
, CONSTRAINTcommentForPost
FOREIGN KEY (postId
) REFERENCESposts
(id
))
我的sequelize版本是:6.3.5
我怎样才能删除 post 并同时删除“孤立”评论?
您指定了 onDelete: 'CASCADE'
,此选项将有效,但仅适用于 sequelize.sync
调用(使用此选项创建外键)。通常的 destroy
调用不会考虑此选项。所以你应该手动更改现有的外键来设置 ON DELETE CASCADE
.