如何使用Knex.js添加复合主键?

时间:2019-03-03 11:19:28

标签: postgresql knex.js composite-primary-key

我有2张桌子。 1个叫具有事件ID的事件,另一个叫票证的表,我要具有事件ID和票证ID的主键。我也在使用PostgreSQL数据库。目前,我将其作为外键,但希望将其作为具有票证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');
});

3 个答案:

答案 0 :(得分:6)

使用您的示例,我认为您有2个选择:

选项1(使用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']);
});

答案 1 :(得分:1)

在您的情况下,我将保留现有的增量字段作为主键,并在创建表后在外键上添加唯一索引。

   knex.schema.alterTable('tickets', function(t) {
      t.unique(['events_id'])
    })

如果要使用组合键,请执行以下操作:

   knex.schema.alterTable('tickets', function(t) {
      t.unique(['id,'events_id'])
    })

答案 2 :(得分:1)

根据Knex的文档here

  

primary — column.primary([constraintName]); table.primary(列,   [constraintName])在单列上调用时,它将设置为   列作为表的主键。如果您需要创建一个   复合主键,在具有列数组的表上调用   取而代之。约束名称默认为tablename_pkey,除非   指定了constraintName。

因此,您可以添加:

table.primary(['name_of_column_1', 'name_of_column_2']);