Knex: Knex.Schema:複合一意キーを作成する方法は?

作成日 2013年08月12日  ·  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-ptzAPIはしばらく前に変更されました。 ドキュメントによるとuniqueはチェーン可能なメソッドになり、 primarynotNullable使用するのと同じ方法で使用できます。

@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ユーザー( id int(11) unsigned not null auto_increment primary key,ネットワークvarchar(3) not null, uid varchar(64), created_at datetime, update_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ソースファイルにリンクするときは、masterの代わりにtag / commitを使用してください。
動作しなくなったリンク: https
VS意味: https
そして最新バージョン(0.8.6)を使用: https

ヒント:githubでブラウジング中に「y」キーを押すと、表示している現在のファイルの現在のファイルに切り替わります。 とても便利です。コメントにghurlを貼り付けると、githubが自動的にそれを実行してくれるといいのですが。

この機能はドキュメントにないため、非推奨になりましたか?

@RichardSimkoテストスイートによると、複合キーのtable.unique([...])構文は引き続きサポートされているため、ドキュメントのバグのように見えます。

ええ、私はそれがまだ機能していることに気づきました、それがドキュメントにないのでそれが削除されようとしているのではないかと心配していました。

では、 table.unique([...])table.primary([...])の違いは何ですか?

ドキュメントによると、 primary([...])を使用することが複合主キーを実行する適切な方法のようです。

単一の列で呼び出されると、その列がテーブルの主キーとして設定されます。 複合主キーを作成するには、列名の配列table.primary(['column1', 'column2'])渡します。 constraintNameが指定されていない限り、制約名のデフォルトはtablename_pkeyです。

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

このページは役に立ちましたか?
0 / 5 - 0 評価