ORM:续集:为两列添加不相等的约束
Posted
技术标签:
【中文标题】ORM:续集:为两列添加不相等的约束【英文标题】:ORM: Sequelize: Add Not Equal Constraint for Two Columns 【发布时间】:2020-03-31 05:13:43 【问题描述】:我有一个following
表。我不想让用户跟随自己,所以我想添加一个CHECK
约束。
例如,如果插入,我希望数据库抛出错误。
userID: 1,
followingID: 1,
如果 userID 和 followingID 相等,我可以使用 javascript 检查,但我希望数据库检查它。
我的 mysql 版本是 8.0.17,所以我认为可以用 SQL 创建这个约束。如何使用 Sequelize 添加此约束?
【问题讨论】:
你能解释清楚一点吗?您希望某个列是唯一的,还是列的组合是唯一的?我们只是在谈论“跟随”表吗? 【参考方案1】:有两种解决方案
1。使用模型验证并在数据库中手动添加检查约束:
模型验证:
const FollowingModel = sequelize.define("following",
userId:
type: Sequelize.INTEGER,
// .. other configuration like `allowNull`
,
followingId:
type: Sequelize.INTEGER,
// .. other configuration like `allowNull`
,
validate:
userShouldNotFollowSelf : function()
if(this.userId === this.followingId)
throw Error("User should not follow self") // Use any custom error class if your application has such class.
请注意,这将允许您在不维护此约束的数据库中创建条目。
这只是ORM的应用层检查,这个应用不会允许任何userId
和followingId
不相同的条目。
Mysql数据库层check constraint.
CREATE TABLE `following`
(
`userId` INT NOT NULL,
`followingId` INT NOT NULL,
CONSTRAINT `no_self_following` CHECK (`userId` <> `followingId`)
-- other properties and foreign key constraints.
);
它将确保不会在userId
和followingId
相同的位置插入此类条目。
2。在sequelize查询界面声明约束。
这需要使用查询接口addConstraint 声明您的模型,如下所示
sequelize.getQueryInterface().addConstraint("following", ['userId'],
type: 'check',
name: "no_self_following"
where:
userId:
[Sequelize.Op.ne]: Sequelize.col("followingId")
);
在所有数据库模型都正确同步后运行。它将添加数据库级别的约束。
使用哪一个?
方法#1 更有效。它在应用程序内部进行检查,而无需进入数据库调用,使您的数据库不那么繁忙。
【讨论】:
很好的答案。谢谢。 更新:这个答案需要一个小的更新。查询接口addConstraint
在更新版本的Sequelize中更新。您需要将字段传递给选项对象。 queryInterface.addConstraint('following', fields: ['userId'], type: 'check', name: 'no_self_following', );
@Johnson 你能先接受这个问题吗?
接受。谢谢。你能更新 addConstraint 参数吗?以上是关于ORM:续集:为两列添加不相等的约束的主要内容,如果未能解决你的问题,请参考以下文章