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的应用层检查,这个应用不会允许任何userIdfollowingId不相同的条目。

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.
);

它将确保不会在userIdfollowingId 相同的位置插入此类条目。

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:续集:为两列添加不相等的约束的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hive 中将一列拆分为两列

将有序列表拆分为两列

将单行及其标题转换为两列[重复]

如何在 Laravel 中为 ORM 急切加载添加多个键约束?

ORM模块,续集死了吗?

在 PSQL 中为可为空的列添加唯一约束