Sequelize,许多使用相同字段的唯一复合键

时间:2017-07-04 12:45:45

标签: sequelize.js composite-key unique-key

如果我正在设计包含以下字段的表格 column_one,column_two,column_three,我希望组合(column_one:column_two)是唯一的,我会做以下事情:

column_one: { type: DataTypes.INTEGER, unique: 'composite_one'},
column_one: { type: DataTypes.INTEGER, unique: 'composite_one'},
column_three: { type: DataTypes.INTEGER}

如果我需要两个独特的组合,包括其中一个字段,该怎么办?例如:(column_one:column_two)和(column_one:column_three)必须都是唯一的,但(column_two:column_three)可以重复

理论上它会是这样的:

column_one: { type: DataTypes.INTEGER, unique: 'composite_one', unique: 'composite_two'},
column_one: { type: DataTypes.INTEGER, unique: 'composite_one'},
column_three: { type: DataTypes.INTEGER, unique: 'composite_two'}

这不是连接表,我不想使用任何原始查询。

此外,column_one必须创建2和3的唯一组合,但这并不意味着第一列,第二列和第三列必须创建一个唯一的组合。

如果解释不清楚,我举个例子:

column_one ----- column_two ---- column_three
-11---------------12----------------13-------
-11---------------12----------------14-------
-18---------------12----------------15-------

不是有效的数据集,因为有两行(column_one:column_two)=(11:12)

但是

column_one ----- column_two ---- column_three
-11---------------12----------------13-------
-11---------------17----------------12-------
-18---------------12----------------15-------
-11---------------12----------------15-------

是一组有效的数据

2 个答案:

答案 0 :(得分:1)

在您的迁移过程中,您可以使用sequelize addConstraint方法

来自Docs

 queryInterface.addConstraint('Users', ['email', 'name'], { type: 'unique', name: 'custom_unique_constraint_name' });

答案 1 :(得分:0)

我设法使用索引来解决这个问题。 This is a link来自sequelize docs的完整文档。至于实现,在模型中我在字段后添加了以下代码:

indexes: [
    { fields: ['column_one', 'column_two'], unique: true },
    { fields: ['column_one', 'column_three'], unique: true }
]

如果我想将模型的更改迁移到现有数据库,则使用类似的方法:

queryInterface.addIndex('epg_data', ['column_one', 'column_two'], {unique: true})
queryInterface.addIndex('epg_data', ['column_one', 'column_three'], {unique: true})
相关问题