Saya mencoba mengimpor file .sql dan gagal membuat tabel.
Inilah permintaan yang gagal:
CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`),
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Saya mengekspor .sql dari database yang sama, saya menjatuhkan semua tabel dan sekarang saya mencoba mengimpornya, mengapa gagal?
MySQL: Tidak dapat membuat tabel './dbname/data.frm' (errno: 150)
mysql
sql
phpmyadmin
mysql-error-150
gtilx
sumber
sumber
Jawaban:
Dari MySQL - Dokumentasi Kendala KUNCI ASING :
sumber
Whether its possible to write Nested Query for my problem
? ..Aku akan meminta kamu untuk tolong jawab aku juga!Kesalahan 150 berarti Anda memiliki masalah dengan kunci asing Anda. Mungkin kunci di meja asing bukan jenis yang sama persis?
sumber
BIGINT
vsINT
ketika menggunakan generator skema.Anda bisa mendapatkan pesan kesalahan yang sebenarnya dengan menjalankan
SHOW ENGINE INNODB STATUS;
dan kemudian mencariLATEST FOREIGN KEY ERROR
di output.Sumber: jawaban dari pengguna lain dalam pertanyaan serupa
sumber
Jenis data harus sama persis. Jika Anda berurusan dengan tipe varchar, tabel harus menggunakan susunan yang sama.
sumber
Saya pikir semua jawaban ini sementara yang benar menyesatkan pertanyaan itu.
Jawaban sebenarnya adalah ini sebelum Anda memulai pemulihan, jika Anda mengembalikan file dump dengan kunci asing:
karena secara alami pemulihan akan menciptakan beberapa kendala sebelum tabel asing bahkan ada.
sumber
Dalam beberapa kasus, Anda mungkin menemukan pesan kesalahan ini jika ada mesin yang berbeda antara tabel terkait. Misalnya, sebuah tabel mungkin menggunakan InnoDB sementara yang lain menggunakan MyISAM. Keduanya harus sama
sumber
Kesalahan no. 150 berarti kegagalan batasan kunci asing. Anda mungkin membuat tabel ini sebelum tabel bergantung pada kunci asing (tabel
keywords
). Buat tabel itu terlebih dahulu dan itu akan berfungsi dengan baik.Jika tidak, hapus pernyataan kunci asing dan tambahkan setelah tabel dibuat - Anda akan mendapatkan pesan kesalahan yang lebih bermakna tentang kegagalan kendala spesifik.
sumber
Ada beberapa hal yang dapat menyebabkan errno 150, jadi bagi orang yang mencari topik ini, inilah yang menurut saya dekat dengan daftar lengkap (sumber Penyebab Errno 150 ):
Untuk errno 150 atau errno 121, cukup mengetik SHOW ENGINE INNODB STATUS, ada bagian yang disebut "KESALAHAN ASING TERBESAR KUNCI". Di bawah itu akan memberi Anda pesan kesalahan yang sangat membantu, yang biasanya akan memberi tahu Anda langsung apa masalahnya. Anda memerlukan hak SUPER untuk menjalankannya, jadi jika Anda tidak memilikinya, Anda hanya perlu menguji skenario berikut.
1) Jenis Data Tidak Cocok: Jenis kolom harus sama
2) Kolom Induk Tidak Diindeks (Atau Diindeks dengan Urutan Salah)
3) Kolom Kolom Tidak Cocok
4) Menggunakan SET NULL pada kolom NOT NULL
5) Table Collations Don't Match: bahkan jika collations kolom cocok, pada beberapa versi MySQL ini bisa menjadi masalah.
6) Kolom Induk Tidak Sebenarnya Ada di Tabel Induk. Periksa ejaan (dan mungkin spasi di awal atau akhir kolom)
7) Salah satu indeks pada salah satu kolom tidak lengkap, atau kolom terlalu panjang untuk indeks lengkap. Perhatikan bahwa MySQL (kecuali jika Anda mengubahnya) memiliki panjang kunci kolom tunggal maksimum 767 byte (ini sesuai dengan kolom UTF varchar (255))
Jika Anda mendapatkan errno 121, berikut adalah beberapa penyebab:
1) Nama kendala yang Anda pilih sudah diambil
2) Pada beberapa sistem jika ada perbedaan kasus dalam pernyataan dan nama tabel Anda. Ini dapat menggigit Anda jika Anda berpindah dari satu server ke server lain yang memiliki aturan penanganan kasus yang berbeda.
sumber
Kadang-kadang MySQL hanya super bodoh - saya bisa mengerti alasan penyebab kunci asing .. tetapi dalam kasus saya, saya baru saja menghapus seluruh database, dan saya masih mendapatkan kesalahan ... mengapa? maksud saya, tidak ada database lagi ... dan pengguna sql yang saya gunakan tidak memiliki akses ke db lain di server ... maksud saya, server "kosong" untuk pengguna saat ini dan saya masih mendapatkan kesalahan ini? Maaf, tapi saya kira MySQL berbohong kepada saya ... tetapi saya bisa mengatasinya :) Cukup tambahkan dua baris SQL ini di sekitar pernyataan Anda:
Sekarang sql harus dieksekusi ... Jika Anda benar-benar memiliki masalah kunci asing, itu akan muncul kepada Anda dengan garis di mana Anda akan mengaktifkan pemeriksaan lagi - ini akan gagal maka .. tetapi server saya hanya sepi :)
sumber
Setelah menjelajahi jawaban di atas, dan bereksperimen sedikit, ini adalah cara yang efektif untuk menyelesaikan kesalahan kunci asing di MySQL (1005 - kesalahan 150).
Agar kunci asing dibuat dengan benar, semua yang diminta MySQL adalah:
Memenuhi persyaratan ini dan semuanya akan baik-baik saja.
sumber
Saya mengalami kesalahan ini ketika telah mem-port aplikasi Windows ke Linux. Di Windows, nama tabel database tidak case-sensitive, dan di Linux mereka case-sensitive, mungkin karena perbedaan sistem file. Jadi, di atas meja Windows
Table1
adalah sama dengantable1
, dan dalamREFERENCES
keduatable1
danTable1
karya. Di Linux, ketika aplikasi digunakantable1
alih-alihTable1
ketika itu membuat struktur database saya melihat kesalahan # 150; ketika saya membuat case case yang benar dalamTable1
referensi, itu mulai bekerja di Linux juga. Jadi, jika tidak ada yang membantu, pastikanREFERENCES
Anda menggunakan huruf besar yang benar dalam nama tabel saat Anda menggunakan Linux.sumber
Ubah mesin tabel Anda, hanya innoDB yang mendukung kunci asing
sumber
Jika tabel PK dibuat dalam satu CHARSET dan kemudian Anda membuat tabel FK di CHARSET lain .. maka Anda juga mungkin mendapatkan kesalahan ini ... Saya juga mendapatkan kesalahan ini tetapi setelah mengubah charset ke PK charset kemudian dieksekusi tanpa kesalahan
sumber
Kesalahan ini dapat terjadi jika dua tabel memiliki referensi, misalnya, satu tabel adalah Siswa dan tabel lainnya adalah Pendidikan, dan kami ingin tabel Pendidikan memiliki referensi kunci asing dari tabel Siswa. Dalam hal ini tipe data kolom untuk kedua tabel harus sama, jika tidak maka akan menghasilkan kesalahan.
sumber
Dalam sebagian besar kasus masalahnya adalah karena perbedaan ENGINE. Jika orang tua dibuat oleh InnoDB maka tabel yang direferensikan seharusnya dibuat oleh MyISAM & sebaliknya
sumber
Dalam kasus saya. Saya mempunyai masalah dengan engine dan charset karena pengaturan perubahan server Hosting saya dan tabel baru saya adalah MyISAM tetapi tabel lama saya adalah InnoDB. Baru saja saya berubah.
sumber
The kunci asing harus memiliki sama datatype sebagai kunci utama . Juga, jika kunci utama tidak ditandatangani maka kunci asing juga harus tidak ditandatangani .
sumber
Saya memiliki masalah yang sama. Itu terkait dengan Kolom kolom Collation dan Character Set . Pastikan Character Set dan Collation harus sama untuk kedua kolom pada dua tabel. Jika Anda ingin mengatur kunci asing itu. Contoh- Jika Anda meletakkan kunci asing pada kolom userID dari tabel userImage yang mereferensikan kolom userID dari tabel users. Kemudian Collation harus sama yaitu utf8_general_ci dan Character set utf8 untuk kedua kolom tabel. Umumnya ketika Anda membuat tabel mysql mengambil dua konfigurasi ini dari pengaturan server.
sumber
Pastikan kolom kunci utama dan kolom referensi Anda memiliki tipe data dan atribut yang sama (unsigned, binary, unsigned zerofill, dll.).
sumber
Kasing tepi nyata adalah di mana Anda telah menggunakan alat MySQL, (Sekuel Pro dalam kasus saya) untuk mengubah nama database. Kemudian dibuat database dengan nama yang sama.
Ini menjaga batasan kunci asing ke nama database yang sama, sehingga database yang diubah namanya (misalnya my_db_renamed) memiliki batasan kunci asing di database yang baru dibuat (my_db)
Tidak yakin apakah ini bug di Sequel Pro, atau jika ada kasus penggunaan yang memerlukan perilaku ini, tetapi saya harus menghabiskan sebagian besar waktu pagi ini: /
sumber
Saya memiliki kesalahan yang sama. Dalam kasus saya alasan untuk kesalahan adalah bahwa saya memiliki pernyataan ON DELETE SET NULL dalam kendala sementara bidang di mana saya meletakkan kendala dalam definisi memiliki pernyataan TIDAK NULL. Membiarkan NULL di lapangan menyelesaikan masalah.
sumber
Saya menghadapi masalah seperti ini saat membuat DB dari textfile.
Saya baru saja menulis baris di atas
Create.bat
dan menjalankan file bat.Kesalahan saya adalah urutan eksekusi dalam file sql saya. Saya mencoba membuat tabel dengan kunci utama dan juga kunci asing. Ketika sedang berjalan itu akan mencari tabel referensi tetapi tabel tidak ada. Jadi itu akan mengembalikan kesalahan semacam itu.
sumber
Saya memiliki masalah yang sama tetapi masalah saya adalah karena saya menambahkan bidang baru ke tabel yang sudah ada yang memiliki data, dan bidang baru merujuk bidang lain dari tabel induk dan juga memiliki Defination NOT NULL dan tanpa NILAI DEFAULT. - Saya menemukan alasan mengapa hal-hal tidak berfungsi adalah karena
Penting untuk diingat bahwa dalam keadaan normal jika Anda merencanakan basis data jauh sebelumnya, dan menerapkan kendala sebelum penyisipan data, skenario khusus ini akan dihindari
Pendekatan yang lebih mudah untuk menghindari gotcha ini adalah dengan
Saya harap ini membantu seseorang
sumber
Mungkin ini akan membantu? Definisi kolom kunci utama harus persis sama dengan kolom kunci asing.
sumber
Pastikan semua tabel dapat mendukung kunci asing - mesin InnoDB
sumber
Kolom tabel PARENT yang Anda maksud dari tabel anak harus unik. Jika tidak, menyebabkan kesalahan no 150.
sumber
Saya memiliki masalah yang sama ketika membuang database mysql Django dengan satu tabel. Saya dapat memperbaiki masalah dengan membuang database ke file teks, memindahkan tabel yang dimaksud ke akhir file menggunakan emacs dan mengimpor file dump sql yang dimodifikasi ke dalam instance baru.
HTH Uwe
sumber
Saya telah memperbaiki masalah dengan membuat variabel menerima
null
sumber
Saya mendapat masalah yang sama ketika menjalankan serangkaian perintah MySQL. Milik saya muncul saat membuat tabel ketika merujuk kunci asing ke tabel lain yang belum dibuat. Ini urutan keberadaan tabel sebelum referensi.
Solusinya: Buat tabel induk terlebih dahulu sebelum membuat tabel anak yang memiliki kunci asing.
sumber
Buat tabel tanpa kunci asing, lalu atur kunci asing secara terpisah.
sumber