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()' 是导致问题的原因。
数据库建立在 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()' 是导致问题的原因。