Knex:更改主键 ID 列错误

Knex : Altering Primary Key Id column Error

数据库建立在 Knex / PostgreSQL 上。 我想更改 table 以将 'unique()' 类型添加到主键 ID 列。 但是迁移失败并显示以下错误消息。

alter table "users" alter column "id" drop not null - column "id" is in a primary key

exports.up = knex =>
  knex.schema
    .raw('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"')
    .createTable('users', table => {
      table
        .uuid('id')
        .primary()
        .notNullable()
        .defaultTo(knex.raw('uuid_generate_v4()'));
      table
        .string('companyName')
        .unique()
        .notNullable();
      table
        .string('username')
        .unique()
        .notNullable();
      table.string('password').notNullable();
      table.string('contactNo').notNullable();
      table.string('email').unique();
      table.string('address');
      table
        .boolean('isAdmin')
        .notNullable()
        .defaultTo(false);
      table
        .enum('businessType', ['catering', 'restaurant'])
        .defaultTo('catering');
      table.integer('lunchQty').defaultTo(null);
      table.integer('dinnerQty').defaultTo(null);
      table
        .uuid('bankAccountId')
        .references('id')
        .inTable('bank_account')
        .onDelete('SET NULL')
        .onUpdate('RESTRICT')
        .index();
      table.string('resetPasswordToken');
      table.timestamps(true, true);
    });

exports.down = knex => knex.schema.dropTable('users');
exports.up = knex =>
  knex.schema.alterTable('users', table => {
    table
      .uuid('id')
      .unique()
      .primary()
      .notNullable()
      .defaultTo(knex.raw('uuid_generate_v4()'))
      .alter();
  });

exports.down = knex =>
  knex.schema.table('users', table => {
    table.dropColumn('id').alter();
  });

PostgreSQL version : 11.1

Knex version : 0.19.2

我到处搜索,但找不到这个问题的答案。 感谢您花时间帮助我!

---------------------------- 版本 -------------- ---------------------- 问题 ) 当我创建 delivery table 时,如下所示。发生以下错误。我还以为是我没有设置主键唯一性造成的呢

migration failed with error: alter table "delivery" add constraint "delivery_userid_foreign" foreign key ("userId") references "users" ("id") on update RESTRICT on delete CASCADE - there is no unique constraint matching given keys for referenced table "users"

exports.up = knex =>
  knex.schema
    .raw('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"')
    .createTable('delivery', table => {
      table
        .uuid('id')
        .primary()
        .notNullable()
        .defaultTo(knex.raw('uuid_generate_v4()'));
      table
        .uuid('routeId')
        .references('id')
        .inTable('routes')
        .onDelete('CASCADE')
        .onUpdate('RESTRICT')
        .index();
      table
        .uuid('userId')
        .references('id')
        .inTable('users')
        .onDelete('CASCADE')
        .onUpdate('RESTRICT')
        .index();
      table.timestamps(true, true);
    });

exports.down = knex => knex.schema.dropTable('delivery');

```

主键已经是唯一的,不为空:不需要你修改。参见 documentation。 Knex 正在尝试按照您的要求进行操作,但为了改变 table,它必须删除 id,它处于 PRIMARY KEY 约束中。

通过删除更改用户文件解决了问题!! 'unique key()' 是导致问题的原因。