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
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 queconstraintName
seja especificado.
http://knexjs.org/#Schema -primary
Comentários muito úteis
Eu acredito que você deveria ser capaz de fazer isso com:
Avise-me se não estiver funcionando.