Knex.js - 如何使用"where"子句创建唯一索引?



我正在使用Knex.js。我想用 WHERE 子句为我的表创建一个唯一的索引:

db.schema.createTable('newTable', function(t) {
  t.increments()
  t.string('col1').defaultTo(null)
  t.string('col2').notNullable()
  t.integer('col3').notNullable()
  t.unique(['col1', 'col2', 'col3']).whereNotNull('col1')
  t.unique(['col2', 'col3']).whereNull('col1')
})

我尝试为表创建两个部分索引。但是,whereNotNull不能与unique函数链接。如何使用"where"子句创建唯一索引?

试试这个:

   knex.schema.raw(
      `CREATE UNIQUE INDEX "unique_partial_newTable_col1_col2_col3" ON "newTable" ("col1", "col2", "col3") WHERE "col1" IS NOT NULL`
    );
   knex.schema.raw(
      `CREATE UNIQUE INDEX "unique_partial_newTable_col2_col3" ON "newTable" ("col2", "col3") WHERE "col1" IS NULL`
    );

尚不支持部分索引。虽然 https://github.com/tgriesser/knex/pull/2401,但还有尚未准备好的 PR。

现在必须使用knex.schema.raw。

可以使用以下语法创建带有条件的索引

knex.table('users', function (table) 
{
    table.index(['name', 'last_name'], 'idx_name_last_name', {
      indexType: 'FULLTEXT',
      storageEngineIndexType: 'hash',
      predicate: knex.whereNotNull('email'),
    });
});

knex.table('users', function (table) 
{
    table.index(['name', 'last_name'], 'idx_name_last_name', {
      indexType: 'unique',
      storageEngineIndexType: 'hash',
      predicate: knex.whereRaw('email=false'),
    });
});

额外示例

通过合并,现在为了在knex中创建唯一的索引,我们可以做

db.schema.createTable('newTable', function(t) {
  t.increments()
  t.string('col1').defaultTo(null)
  t.string('col2').notNullable()
  t.integer('col3').notNullable()
  t.unique(['col1', 'col2', 'col3'], {
    useConstraint: false,
    predicate: knex.whereNotNull('col1')
  })
  t.unique(['col2', 'col3'], {
    useConstraint: false,
    predicate: knex.whereNull('col1')
  })
})

最新更新