如何使用 Knex.js 添加复合主键?
How do I add a Composite primary key with Knex.js?
我有 2 个 table。 1 个调用了带有事件 ID 的事件,另一个 table 调用了票证,我希望它具有事件 ID 和票证 ID 的主键。我也在使用 PostgreSQL 数据库。目前,我将它作为外键,但希望将其作为票证 table 中的主键和票证 ID。
knex.schema.createTable('events', function (table) {
table.increments('id');
table.string('eventName');
});
knex.schema.createTable('tickets', function (table) {
table.increments('id');
table.string('ticketName');
table.foreign('tickets').references('events_id').inTable('events');
});
在你的情况下,我会保留现有的增量字段作为主键,并在创建 table 后在外键上添加一个唯一索引。
knex.schema.alterTable('tickets', function(t) {
t.unique(['events_id'])
})
如果您想要复合键,请执行以下操作:
knex.schema.alterTable('tickets', function(t) {
t.unique(['id','events_id'])
})
根据 Knex 的文档 here:
primary — column.primary([constraintName]); table.primary(columns,
[constraintName]) When called on a single column it will set that
column as the primary key for a table. If you need to create a
composite primary key, call it on a table with an array of column
names instead. Constraint name defaults to tablename_pkey unless
constraintName is specified.
因此,对于您的情况,您可以添加:
table.primary(['name_of_column_1', 'name_of_column_2']);
使用您的示例,我认为您有 2 个选择:
方案一(使用id作为主键并添加唯一约束):
knex.schema.createTable('events', function (table) {
table.increments('id').primary();
table.string('eventName');
});
knex.schema.createTable('tickets', function (table) {
table.increments('id').primary();
table.string('ticketName');
table.integer('event_id').references('id').inTable('events');
table.unique(['id', 'event_id']);
});
选项2(使用两个id作为复合主键):
knex.schema.createTable('events', function (table) {
table.increments('id').primary();
table.string('eventName');
});
knex.schema.createTable('tickets', function (table) {
table.increments('id');
table.string('ticketName');
table.integer('event_id').references('id').inTable('events');
table.primary(['id', 'event_id']);
});
我有 2 个 table。 1 个调用了带有事件 ID 的事件,另一个 table 调用了票证,我希望它具有事件 ID 和票证 ID 的主键。我也在使用 PostgreSQL 数据库。目前,我将它作为外键,但希望将其作为票证 table 中的主键和票证 ID。
knex.schema.createTable('events', function (table) {
table.increments('id');
table.string('eventName');
});
knex.schema.createTable('tickets', function (table) {
table.increments('id');
table.string('ticketName');
table.foreign('tickets').references('events_id').inTable('events');
});
在你的情况下,我会保留现有的增量字段作为主键,并在创建 table 后在外键上添加一个唯一索引。
knex.schema.alterTable('tickets', function(t) {
t.unique(['events_id'])
})
如果您想要复合键,请执行以下操作:
knex.schema.alterTable('tickets', function(t) {
t.unique(['id','events_id'])
})
根据 Knex 的文档 here:
primary — column.primary([constraintName]); table.primary(columns, [constraintName]) When called on a single column it will set that column as the primary key for a table. If you need to create a composite primary key, call it on a table with an array of column names instead. Constraint name defaults to tablename_pkey unless constraintName is specified.
因此,对于您的情况,您可以添加:
table.primary(['name_of_column_1', 'name_of_column_2']);
使用您的示例,我认为您有 2 个选择:
方案一(使用id作为主键并添加唯一约束):
knex.schema.createTable('events', function (table) {
table.increments('id').primary();
table.string('eventName');
});
knex.schema.createTable('tickets', function (table) {
table.increments('id').primary();
table.string('ticketName');
table.integer('event_id').references('id').inTable('events');
table.unique(['id', 'event_id']);
});
选项2(使用两个id作为复合主键):
knex.schema.createTable('events', function (table) {
table.increments('id').primary();
table.string('eventName');
});
knex.schema.createTable('tickets', function (table) {
table.increments('id');
table.string('ticketName');
table.integer('event_id').references('id').inTable('events');
table.primary(['id', 'event_id']);
});