8
votes

Comment ajouter une clé primaire composite avec Knex.js?

J'ai 2 tables. 1 événements appelés avec un ID d'événement et une autre table appelée tickets dont je veux avoir les clés primaires d'ID d'événement et d'ID de ticket. J'utilise également une base de données PostgreSQL. Pour le moment, je l'ai comme clé étrangère mais je voudrais l'avoir comme clé primaire dans la table des tickets avec l'ID de ticket.

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 commentaires

3 Réponses :


0
votes

Dans votre cas, j'aurais laissé le champ d'incréments existant comme clé primaire et ajouté un index unique sur la clé étrangère après la création de la table.

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

Si vous voulez une clé composite, procédez comme suit:

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


1 commentaires

mais tu ne réponds pas à la question



11
votes

Selon la documentation de Knex ici :

primaire - column.primary ([constraintName]); table.primary (colonnes, [constraintName]) Lorsqu'il est appelé sur une seule colonne, il définit cette colonne comme clé primaire d'une table. Si vous devez créer une clé primaire composite, appelez-la plutôt sur une table avec un tableau de noms de colonnes. Le nom de la contrainte est défini par défaut sur tablename_pkey, sauf si constraintName est spécifié.

Par conséquent, dans votre cas, vous pouvez ajouter:

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


0 commentaires

5
votes

En utilisant votre exemple, je pense que vous avez 2 options:

Option 1 (utiliser l'id comme clé primaire et ajouter une contrainte unique):

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']);
});

Options 2 (utiliser les deux identifiants comme clés primaires composites):

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']);
});


0 commentaires