Knex: Knex.Schema: Bagaimana cara membuat kunci unik komposit?

Dibuat pada 12 Agu 2013  ·  12Komentar  ·  Sumber: knex/knex

Sebagai contoh,

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

Bagaimana cara melakukannya dengan Knex.Schema.createTable

question

Komentar yang paling membantu

Saya yakin Anda bisa melakukan ini dengan:

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

Beri tahu saya jika sepertinya tidak berfungsi.

Semua 12 komentar

Saya yakin Anda bisa melakukan ini dengan:

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

Beri tahu saya jika sepertinya tidak berfungsi.

Bekerja, terima kasih! Bersiap untuk beralih dari Sequelize.

saya mencoba menjalankan migrasi

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

Tetapi saya tidak akan mendapatkan indeks unik

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

Apa yang salah?

@ theo-ptz API berubah beberapa waktu lalu. Menurut dokumen , unique sekarang menjadi metode yang dapat dirantai yang Anda gunakan dengan cara yang sama seperti Anda menggunakan primary dan notNullable .

@bendrucker , terima kasih.

Tapi ada sesuatu yang tidak berhasil.
Saya mencoba menjalankan kode ini

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

Saya melihat ini di debug
--> ComQueryPacket { command: 3, sql: 'create table pengguna ( id int(11) unsigned not null auto_increment primary key, jaringan varchar(3) not null, uid varchar(64), create_at datetime, updated_at datetime) default character set utf8' }

Saya tidak mendapatkan indeks.

 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

Apa yang salah?

Apakah ada cara untuk membuat indeks unik gabungan dalam migrasi?

Lihat pengujian integrasi untuk contoh batasan unik komposit:

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

@bendrucker saat Anda menautkan ke file sumber, gunakan tag / komit sebagai ganti master:
Tautan Anda yang tidak berfungsi lagi: https://github.com/tgriesser/knex/blob/master/test/integration/schema/index.js#L92
VS apa yang Anda maksud: https://github.com/tgriesser/knex/blob/0.5.11/test/integration/schema/index.js#L92
Dan menggunakan versi terbaru (0.8.6): https://github.com/tgriesser/knex/blob/0.8.6/test/integration/schema/index.js#L157

Protip: jika Anda menekan tombol "y" saat menjelajah di github, ia akan beralih ke sha url saat ini untuk file yang sedang Anda lihat. Sangat nyaman, saya berharap github akan melakukannya secara otomatis saat Anda menempelkan url gh di komentar

Apakah fitur ini sudah usang karena tidak ada dalam dokumentasi?

@RichardSimko Menurut rangkaian pengujian, sintaks table.unique([...]) untuk kunci majemuk masih didukung, jadi sepertinya ada bug dengan dokumentasinya.

Ya, saya menyadari bahwa itu masih berfungsi, saya hanya khawatir itu akan dihapus karena tidak ada di dokumen.

Jadi apa perbedaan antara table.unique([...]) dan table.primary([...]) ?

Sesuai dokumen, tampaknya menggunakan primary([...]) adalah cara yang tepat untuk melakukan kunci utama komposit:

Ketika dipanggil pada satu kolom, kolom itu akan ditetapkan sebagai kunci utama untuk sebuah tabel. Untuk membuat kunci utama majemuk, berikan larik nama kolom: table.primary(['column1', 'column2']) . Nama batasan default ke tablename_pkey kecuali constraintName ditentukan.

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat