Knex: Knex.Schema: Как создать составной уникальный ключ?

Созданный на 12 авг. 2013  ·  12Комментарии  ·  Источник: knex/knex

Например,

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

Как мне это сделать с помощью Knex.Schema.createTable

question

Самый полезный комментарий

Я считаю, что вы сможете сделать это с помощью:

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

Сообщите мне, если это не работает.

Все 12 Комментарий

Я считаю, что вы сможете сделать это с помощью:

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

Сообщите мне, если это не работает.

Работает, спасибо! Подготовка к переходу с Sequelize.

я пытаюсь запустить миграцию

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

Но я не получу уникальный индекс

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

Что может быть не так?

@ theo-ptz API изменился некоторое время назад. Согласно документации , unique теперь представляет собой цепочный метод, который вы должны использовать так же, как вы используете primary и notNullable .

@bendrucker , спасибо.

Но что-то не получается.
Я пытаюсь запустить этот код

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

Я видел это при отладке
--> 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' }

Индекс не получил.

 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

Что может быть не так?

Есть ли способ создать составной уникальный индекс при миграции?

См. В интеграционных тестах пример составного уникального ограничения:

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

@bendrucker, когда вы
Ваша ссылка, которая больше не работает: https://github.com/tgriesser/knex/blob/master/test/integration/schema/index.js#L92
VS, что вы имели в виду: https://github.com/tgriesser/knex/blob/0.5.11/test/integration/schema/index.js#L92
И используя последнюю версию (0.8.6): https://github.com/tgriesser/knex/blob/0.8.6/test/integration/schema/index.js#L157

Совет: если вы нажмете клавишу «y» во время просмотра на github, он переключится на текущий URL-адрес sha для текущего файла, который вы просматриваете. Супер удобно, я бы хотел, чтобы github просто делал это автоматически, когда вы вставляете URL-адрес gh в комментарий

Эта функция устарела, поскольку ее нет в документации?

@RichardSimko Согласно набору тестов, синтаксис table.unique([...]) для составных ключей все еще поддерживается, поэтому это похоже на ошибку в документации.

Да, я понял, что он все еще работает, я просто волновался, что его собираются удалить из-за того, что его нет в документации.

Так в чем разница между table.unique([...]) и table.primary([...]) ?

Согласно документам, похоже, что использование primary([...]) - это правильный способ создания составных первичных ключей:

При вызове для одного столбца он устанавливает этот столбец в качестве первичного ключа для таблицы. Чтобы создать составной первичный ключ, передайте массив имен столбцов: table.primary(['column1', 'column2']) . Имя ограничения по умолчанию - tablename_pkey если не указано constraintName .

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги