我有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');
});
答案 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']);