Knex: Tidak Dapat Menambahkan Batasan Kunci Asing

Dibuat pada 17 Apr 2014  ·  11Komentar  ·  Sumber: knex/knex

Saat menjalankan migrasi dengan kode di bawah ini, saya mendapatkan pesan "Tidak dapat menambahkan batasan kunci asing". Adakah yang mengarahkan saya ke arah yang benar?

exports.up = function(knex, Promise) {
    var defer=Promise.defer();

    knex.schema.createTable('User',function(table){

        //--Create User Table
        table.increments('UserId').primary();
        table.string('username');
        table.string('email',60);
        table.string('password',65);
        table.timestamps();

    })
    .then(function(){
        return knex.schema.createTable('Comment',function(table){

            //--Create Comment Table
            table.increments('CommentId').primary();
            table.string('Comment');

            table.integer('UserId',11).inTable('User').references('UserId');

        });     
    })
    .then(function(){

            defer.resolve();
    });


    return defer.promise;

};

exports.down = function(knex, Promise) {

};  

Komentar yang paling membantu

Sebagai FYI untuk orang-orang masa depan yang membaca ini:
table.integer('UserId',11).unsigned().inTable('User').references('UserId');
sekarang
table.integer('UserId',11).unsigned().references('UserId').inTable('User');

Semua 11 komentar

Dengan asumsi Anda mungkin menggunakan mysql, Anda perlu menentukan bahwa UserId adalah .unsigned()

Anda juga tidak perlu menunda itu di sana, Anda bisa mengembalikan knex.schema.createTable .

exports.up = function(knex, Promise) {
  return knex.schema.createTable('User',function (table){ 
      table.increments('UserId').primary();
      table.string('username');
      table.string('email',60);
      table.string('password',65);
      table.timestamps();
  })
  .then(function () {
    return knex.schema.createTable('Comment',function(table){
      table.increments('CommentId').primary();
      table.string('Comment');
      table.integer('UserId',11).unsigned().inTable('User').references('UserId');
    });     
  });
};

Anda hampir tidak akan pernah membutuhkan Promise.defer .

Wow. Kalian keren!! Bekerja dengan sempurna. Terima kasih atas respons cepat dan tip tentang kode yang lebih bersih :)

Anda mengerti! Anda mungkin merasa lebih mudah untuk hanya membagi bidang data/pk dan referensi fk menjadi dua migrasi. Alternatifnya adalah apa yang telah Anda lakukan di sini, tetapi perlu diingat bahwa Anda juga perlu memastikan urutan pada rollback.

Dalam versi yang akan segera hadir, Anda akan dapat menyambungkan semua panggilan skema dan dijamin akan berjalan secara berurutan:

exports.up = function(knex, Promise) {
  return knex.schema.createTable('User', function(table){ 
      table.increments('UserId').primary();
      table.string('username');
      table.string('email',60);
      table.string('password',65);
      table.timestamps();
  }).createTable('Comment',function(table){
      table.increments('CommentId').primary();
      table.string('Comment');
      table.integer('UserId',11).unsigned().inTable('User').references('UserId');  
  });
};

bermigrasi ke bawah:

exports.down = function(knex, Promise) {
  return knex.schema.dropTable('Comment').dropTable('User');
};

Sebagai FYI untuk orang-orang masa depan yang membaca ini:
table.integer('UserId',11).unsigned().inTable('User').references('UserId');
sekarang
table.integer('UserId',11).unsigned().references('UserId').inTable('User');

Terima kasih @batman!

Mengalami kesalahan dengan notNullable(). Kunci asing saya selalu nol:
EX 1:) table.integer('restaurant_id').unsigned().references('id').inTable('Restaurants');
Kunci asing('restaurant_id") tidak cocok dengan 'id' di tabel 'Restoran'. Ini benar-benar nol, ketika saya mencoba menggunakan :
EX2: ) table.integer('restaurant_id').unsigned().notNullable().references('id').inTable('Restaurants');
yang melemparkan Kesalahan (tidak dapat menambahkan batasan kunci asing).

Saya telah melihat pembuatan kunci asing dari formulir ini berfungsi jika kunci asing itu adalah string, tetapi dengan bilangan bulat yang merujuk pada kunci utama ('id). Apakah karena kunci Utama ('id') pada induknya bukan tipe integer dan tipe default?
table.increments('id').primary();

Saya telah melihat kunci asing berfungsi ketika mereka adalah tipe String, tetapi memiliki referensi tipe integer ke kunci utama ('id') di tabel lain menimbulkan kesalahan.

Ketika saya menggunakan EX1) Semuanya tampak berfungsi, tetapi kunci asing saya tidak bertambah secara otomatis, itu hanya nol sepanjang waktu. Saya juga tidak dapat menaikkannya secara manual menggunakan fungsi model. Apakah masalah ini diselesaikan di suatu tempat?

Terima kasih,

memperbarui:
Cari tahu, Anda hanya perlu menambahkan kolom bilangan bulat pada baris terpisah dari tempat Anda menjadikannya kunci asing.

table.integer('restaurant_id').unsigned();
          table.integer('location_id').unsigned();
          table.foreign('restaurant_id').references('Restaurants.id');
          table.foreign('location_id').references('Locations.id');

Mungkin perlu dijelaskan dalam dokumen bahwa metode .unsigned() harus digunakan saat mendefinisikan kunci asing di MySQL. Saya mencoba menggunakan ini dengan Objection.js dan hampir menyerah karena saya baru memulai dan mendapat kesalahan pada pandangan pertama. Pikir kedua kerangka itu bermasalah.

Pikir kedua kerangka itu bermasalah.

@Juanpam tidak perlu menggunakannya. PR dipersilakan sekalipun. Semoga beruntung :)

@elhigu Saya tidak bermaksud menyinggung siapa pun! Saya memang menggunakan framework . Hanya berpikir bahwa untuk pendatang baru, seperti saya, itu mungkin masalah umum karena hubungan adalah fitur yang biasa digunakan di ORM dan pembuat kueri. Juga, MySQL adalah RDBMS umum.

Saya tidak bisa melakukan PR sekarang, tetapi jika ada yang tertarik, saya mencoba menggunakan XAMPP MySQL saat membuat kunci asing. Ternyata ketika menggunakan metode .primary() jenis bidang yang dibuat adalah INT(11) tidak ditandatangani dan ketika Anda membuat bidang referensi menggunakan .integer() jenis bidang yang dihasilkan adalah INT(11) ditandatangani sehingga pembuatan kunci asing gagal. @tgriesser fix bekerja dengan sangat baik, tetapi akan lebih baik jika Anda dapat menemukan perbaikan/masalah umum seperti ini di dokumen.

Pokoknya, kerja bagus!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

lanceschi picture lanceschi  ·  3Komentar

aj0strow picture aj0strow  ·  3Komentar

mattgrande picture mattgrande  ·  3Komentar

koskimas picture koskimas  ·  3Komentar

sandrocsimas picture sandrocsimas  ·  3Komentar