Knex: Knex.Schema: Comment créer une clé unique composite?

Créé le 12 août 2013  ·  12Commentaires  ·  Source: knex/knex

Par exemple,

ALTER TABLE users ADD UNIQUE KEY(LoginID, Email);
ALTER TABLE users ADD UNIQUE KEY(Email);
ALTER TABLE users ADD UNIQUE KEY(LoginID);

Comment faire avec Knex.Schema.createTable

question

Commentaire le plus utile

Je pense que vous devriez pouvoir le faire avec:

Knex.Schema.createTable('tableName', function(table) {
  table.unique(['LoginID', 'Email']);
  table.unique('LoginID');
  table.unique('Email');
});

Faites-moi savoir si cela ne semble pas fonctionner.

Tous les 12 commentaires

Je pense que vous devriez pouvoir le faire avec:

Knex.Schema.createTable('tableName', function(table) {
  table.unique(['LoginID', 'Email']);
  table.unique('LoginID');
  table.unique('Email');
});

Faites-moi savoir si cela ne semble pas fonctionner.

Fonctionne, merci! Préparation pour passer de Sequelize.

j'essaye de lancer une migration

knex.schema.createTable('users', function (table) {
        table.increments('id').primary();
        table.string('network', 3).notNullable();
        table.string('uid', 64).notNullable();
        table.unique(['network', 'uid']);
        table.timestamps();
}).then(function () {
        console.log('Users Table is Created!');
});

Mais je n'obtiendrai pas d'index unique

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `network` varchar(3) NOT NULL,
  `uid` varchar(64) NOT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Qu'est-ce qui ne va pas?

@ theo-ptz L'API a changé il y a quelque temps. Selon la documentation , unique est maintenant une méthode chaînable que vous utiliseriez de la même manière que vous utilisez primary et notNullable .

@bendrucker , merci.

Mais quelque chose ne fonctionne pas.
J'essaye d'exécuter ce code

knex.schema.createTable('users', function (table) {
    table.increments('id').primary();
    table.string('network', 3).notNullable();
    table.string('uid', 64).unique();
    table.timestamps();
})

J'ai vu cela dans le débogage
--> ComQueryPacket { command: 3, sql: 'create table utilisateurs ( id int(11) unsigned not null auto_increment primary key, réseau varchar(3) not null, uid varchar(64), created_at datetime, mis datetime) default character set utf8' } jour_at

Je n'ai pas eu d'index.

 CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `network` varchar(3) NOT NULL,
  `uid` varchar(64) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Qu'est-ce qui ne va pas?

Est-il possible de créer un index unique composite lors de la migration?

Voir les tests d'intégration pour un exemple de contrainte unique composite:

https://github.com/tgriesser/knex/blob/master/test/integration/schema/index.js#L92

Protip: si vous appuyez sur la touche "y" pendant la navigation sur github, il passe à l'URL actuelle du fichier que vous visualisez. Super pratique, j'aimerais que github le fasse automatiquement lorsque vous collez une URL gh dans un commentaire

Cette fonctionnalité est-elle obsolète car elle ne figure pas dans la documentation?

@RichardSimko Selon la suite de tests, la syntaxe table.unique([...]) pour les clés composées est toujours supportée, donc cela ressemble à un bogue avec la documentation.

Ouais, j'ai réalisé que cela fonctionnait toujours, j'étais juste inquiet qu'il soit sur le point d'être supprimé car il ne figurait pas dans la documentation.

Alors, quelle est la différence entre table.unique([...]) et table.primary([...]) ?

Selon la documentation, il semble que l'utilisation de primary([...]) soit la bonne façon de créer des clés primaires composites:

Lorsqu'il est appelé sur une seule colonne, il définira cette colonne comme clé primaire d'une table. Pour créer une clé primaire composée, transmettez un tableau de noms de colonnes: table.primary(['column1', 'column2']) . Le nom de la contrainte par défaut est tablename_pkey sauf si constraintName est spécifié.

http://knexjs.org/#Schema -primary

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

mtom55 picture mtom55  ·  3Commentaires

legomind picture legomind  ·  3Commentaires

koskimas picture koskimas  ·  3Commentaires

tjwebb picture tjwebb  ·  3Commentaires

hyperh picture hyperh  ·  3Commentaires