如何使用 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']);
});