Knex: Knex.Schema: Como criar uma chave única composta?

Criado em 12 ago. 2013  ·  12Comentários  ·  Fonte: knex/knex

Por exemplo,

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

Como faço isso com Knex.Schema.createTable

question

Comentários muito úteis

Eu acredito que você deveria ser capaz de fazer isso com:

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

Avise-me se não estiver funcionando.

Todos 12 comentários

Eu acredito que você deveria ser capaz de fazer isso com:

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

Avise-me se não estiver funcionando.

Funciona, obrigado! Preparando para mudar do Sequelize.

eu tento fazer uma migração

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

Mas eu não vou conseguir um índice único

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

O que pode estar errado?

@ theo-ptz A API mudou há um tempo. De acordo com os documentos , unique agora é um método encadeado que você usaria da mesma maneira que está usando primary e notNullable .

@bendrucker , obrigado.

Mas algo não funciona.
Eu tento executar este código

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

Eu vi isso no debug
--> ComQueryPacket { command: 3, sql: 'create table users ( id int(11) unsigned not null auto_increment primary key, network varchar(3) not null, uid varchar(64), created_at datetime, updated_at datetime) default character set utf8' }

Não obtive um índice.

 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

O que pode estar errado?

Existe alguma maneira de criar um índice único composto na migração?

Consulte os testes de integração para obter um exemplo de uma restrição única composta:

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

@bendrucker ao vincular a um arquivo de origem, use uma tag / commit em vez do master:
Seu link que não funciona mais: https://github.com/tgriesser/knex/blob/master/test/integration/schema/index.js#L92
VS o que você quis dizer: https://github.com/tgriesser/knex/blob/0.5.11/test/integration/schema/index.js#L92
E usando a versão mais recente (0.8.6): https://github.com/tgriesser/knex/blob/0.8.6/test/integration/schema/index.js#L157

Protip: se você pressionar a tecla "y" enquanto navega no github, ele muda para o sha url atual do arquivo que você está visualizando. Muito conveniente, gostaria que o github fizesse isso automaticamente quando você cola um URL do gh em um comentário

Este recurso foi descontinuado por não estar na documentação?

@RichardSimko De acordo com o conjunto de testes, a sintaxe table.unique([...]) para chaves compostas ainda é suportada, então parece um bug com a documentação.

Sim, percebi que ainda funcionava, só estava preocupado que estivesse prestes a ser removido por não estar nos documentos.

Então qual é a diferença entre table.unique([...]) e table.primary([...]) ?

De acordo com os documentos, parece que usar primary([...]) é a maneira correta de fazer chaves primárias compostas:

Quando chamado em uma única coluna, ele definirá essa coluna como a chave primária de uma tabela. Para criar uma chave primária composta, passe uma matriz de nomes de coluna: table.primary(['column1', 'column2']) . O padrão do nome da restrição é tablename_pkey menos que constraintName seja especificado.

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

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

rarkins picture rarkins  ·  3Comentários

zettam picture zettam  ·  3Comentários

PaulOlteanu picture PaulOlteanu  ·  3Comentários

sandrocsimas picture sandrocsimas  ·  3Comentários

lanceschi picture lanceschi  ·  3Comentários