我有一个不起作用的模型的唯一索引。这是我的模型
const Script = sequelize.define('Script', {
name: {
type: DataTypes.STRING,
allowNull: false,
},
deletedAt: {
type: DataTypes.DATE,
allowNull: true
},
}, {
indexes: [
{
unique: true,
fields: ['userId', 'name', 'deletedAt']
}
],
timestamps: true,
paranoid: true
});
User.Script = User.hasMany(Script, {
foreignKey: {
allowNull: false,
name: 'userId'
},
onDelete: 'CASCADE',
});
Script.User = Script.belongsTo(User, { foreignKey: 'userId' });
我检查了数据库,索引存在。因此,当我创建两个具有相同 userId 和名称的脚本时,它不会按预期抛出错误。相反,我可以为索引中的所有字段创建 2 条具有相同值的记录。这两条记录都有
deletedAt: null
。也许这与领域有关deletedAt
,但我不确定为什么。当我仅使用 ['userId', 'name']
创建索引时,这似乎有效。任何人都知道为什么带有 deletedAt
的唯一索引不起作用?
摘自手册:
一般来说,如果有多个,就会违反唯一约束 表中的行,其中包含的所有列的值 约束条件相等。默认情况下,两个空值不 在此比较中被视为相等。这意味着即使在场 由于唯一约束,可以存储重复的行 至少一个受约束列中包含空值。这 可以通过添加 NULLS NOT DISTINCT 子句来更改行为,例如
创建表产品( Product_no 整数唯一空值不不同, 名称文本, 价格数字);
因此,对于 NULL,您必须告诉数据库什么是唯一的。
不知道如何在续集中做到这一点。