Kode Kesalahan: 1005. Tidak dapat membuat tabel '…' (errno: 150)

103

Saya mencari solusi untuk masalah ini di Internet dan memeriksa pertanyaan Stack Overflow, tetapi tidak ada solusi yang berfungsi untuk kasus saya.

Saya ingin membuat kunci asing dari tabel sira_no ke metal_kod.

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

Skrip ini mengembalikan:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

Saya mencoba menambahkan indeks ke tabel referensi:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

Saya memeriksa METAL_KODU di kedua tabel (charset dan collation), tetapi saya tidak dapat menemukan solusi untuk masalah ini. Bagaimana cara memperbaiki masalah ini?

Berikut adalah tabel metal_kod:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100
lamostreta.dll
sumber
Dapatkah Anda menunjukkan skema untuk metal_kodtabel ... bidang mana dalam tabel itu yang harus dirujuk oleh Kunci Asing?
Manse

Jawaban:

271

Kode Kesalahan: 1005 - ada referensi kunci utama yang salah dalam kode Anda

Biasanya ini karena bidang kunci asing yang direferensikan tidak ada. Mungkin Anda salah ketik, atau periksa kasusnya seharusnya sama, atau ada ketidakcocokan tipe kolom. Bidang terkait kunci asing harus sama persis dengan definisi.

Beberapa penyebab yang diketahui mungkin:

  1. Jenis dan / atau ukuran dua bidang kunci tidak sama persis. Misalnya, jika salah satu INT(10)bidang kunci perlu INT(10)juga dan tidak INT(11)atau TINYINT. Anda mungkin ingin mengonfirmasi ukuran bidang menggunakan SHOW CREATE TABLEkarena Browser Kueri terkadang akan menampilkan secara visual hanya INTEGERuntuk INT(10)dan INT(11). Anda juga harus memastikan bahwa yang satu tidak SIGNEDdan yang lainnya adalah UNSIGNED. Keduanya harus persis sama.
  2. Salah satu bidang kunci yang Anda coba rujuk tidak memiliki indeks dan / atau bukan kunci utama. Jika salah satu bidang dalam hubungan tersebut bukan kunci utama, Anda harus membuat indeks untuk bidang tersebut.
  3. Nama kunci asing adalah duplikat dari kunci yang sudah ada. Pastikan nama kunci asing Anda unik dalam database Anda. Cukup tambahkan beberapa karakter acak di akhir nama kunci Anda untuk mengujinya.
  4. Satu atau kedua tabel Anda adalah MyISAMtabel. Untuk menggunakan kunci asing, tabel harus berupa keduanya InnoDB. (Sebenarnya, jika kedua tabel ada MyISAMmaka Anda tidak akan mendapatkan pesan kesalahan - itu tidak akan membuat kunci.) Di Browser Kueri, Anda dapat menentukan jenis tabel.
  5. Anda telah menentukan kaskade ON DELETE SET NULL, tetapi bidang kunci yang relevan disetel ke NOT NULL. Anda dapat memperbaikinya dengan mengubah kaskade Anda atau menyetel bidang untuk mengizinkan NULLnilai.
  6. Pastikan bahwa opsi Charset dan Collate sama baik pada level tabel maupun level bidang individual untuk kolom kunci.
  7. Anda memiliki nilai default (yaitu, default = 0) di kolom kunci asing Anda
  8. Salah satu bidang dalam hubungan adalah bagian dari kunci kombinasi (komposit) dan tidak memiliki indeks individualnya sendiri. Meskipun bidang memiliki indeks sebagai bagian dari kunci komposit, Anda harus membuat indeks terpisah hanya untuk bidang kunci tersebut agar dapat menggunakannya dalam batasan.
  9. Anda mengalami kesalahan sintaks dalam ALTERpernyataan Anda atau Anda salah mengetik salah satu nama bidang dalam hubungan tersebut
  10. Nama kunci asing Anda melebihi panjang maksimum 64 karakter.

Untuk lebih jelasnya, lihat: Nomor Kesalahan MySQL 1005 Tidak dapat membuat tabel

Peter Mortensen
sumber
4
masalahnya adalah rangkaian karakter kunci asing tidak cocok. Terima kasih atas jawabannya.
lamostreta
4
SHOW ENGINE INNODB STATUSseperti yang disebutkan dalam pertanyaan ini membantu saya mendiagnosis masalah khusus saya (PEBCAK, dalam kasus saya ...)
Hobo
1
Sial, bahkan itu adalah kunci utama. Anda perlu membuat indeks individual untuk kunci itu. terima kasih ini memecahkan masalah saya.
RSB
3
# 4 adalah masalah saya - salah satu tabel adalah MyISAM dan skrip mencoba membuat tabel InnoDB. Saya mengalami masalah ini ketika saya mencoba menerapkan sistem lama yang awalnya menjalankan MySQL 5.0 atau versi serupa, di mana mesin penyimpanan default adalah MyISAM dan skripnya berjalan dengan baik. Lingkungan saya saat ini adalah 5.5 dan penyimpanan default adalah InnoDB. Menambahkan set names 'utf8', storage_engine=MYISAM;di awal skrip memecahkan masalah bagi saya. Terima kasih @ user319198 dan @Stefano untuk jawaban yang lengkap! : o)
Boris Chervenkov
1
Milik saya kehilangan atribut 'unsigned' seperti yang disebutkan di # 1, terima kasih!
helvete
11

Ini juga bisa terjadi saat mengekspor database Anda dari satu server ke server lain dan tabel dicantumkan dalam urutan abjad secara default.
Jadi, tabel pertama Anda dapat memiliki kunci asing dari tabel lain yang belum dibuat. Dalam kasus seperti itu, nonaktifkan foreign_key_checks dan buat database.

Cukup tambahkan yang berikut ini ke skrip Anda:

SET FOREIGN_KEY_CHECKS=0;

dan itu akan berhasil.

happyhardik
sumber
4

Sangat sering terjadi ketika kunci asing dan kunci referensi tidak memiliki jenis atau panjang yang sama.

zahid9i
sumber
4

Kadang-kadang karena tabel master dijatuhkan (mungkin dengan menonaktifkan foreign_key_checks), tetapi kunci asing CONSTRAINT masih ada di tabel lain. Dalam kasus saya , saya telah menjatuhkan tabel dan mencoba membuatnya kembali, tetapi itu memberikan kesalahan yang sama bagi saya.

Jadi coba lepaskan semua BATAS kunci asing dari semua tabel jika ada dan kemudian perbarui atau buat tabel.

rajug
sumber
2

Saya mengalami kesalahan serupa. Masalahnya berkaitan dengan tabel anak dan induk tidak memiliki charset dan pemeriksaan yang sama. Ini bisa diperbaiki dengan menambahkan ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... pada pernyataan SQL berarti ada beberapa kode yang hilang.

pengguna2258168
sumber
2

Kunci asing harus memiliki tipe yang sama persis dengan kunci utama yang dirujuknya. Untuk contoh memiliki tipe “INT UNSIGNED NOT NULL” maka kunci depan juga harus “INT UNSIGNED NOT NULL”

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';
Yaina Villafañes
sumber
unsigned adalah masalah bagi saya. Terima kasih!
Gabo
2

Kode Kesalahan: 1005

Saya memiliki masalah serupa, jadi berikut beberapa hal yang saya coba (tidak dalam urutan apa pun, kecuali untuk solusinya :))

  1. Mengubah nama kunci asing (tidak berhasil)
  2. Mengurangi panjang kunci asing
  3. Memverifikasi tipe data (tidak ada yang salah)
  4. Periksa indeks
  5. Periksa collations (semuanya baik-baik saja, sial lagi)
  6. Meja terpotong, tidak ada gunanya
  7. Menjatuhkan tabel dan dibuat ulang
  8. Mencoba untuk melihat apakah ada referensi melingkar yang sedang dibuat --- semuanya baik-baik saja
  9. Akhirnya, saya melihat bahwa saya membuka dua editor. Satu yang ada di PhpStorm (JetBrains) dan meja kerja MySQL lainnya. Tampaknya PhpStorm / MySQL Workbench membuat semacam kunci edit.

    Saya menutup PhpStorm hanya untuk memeriksa apakah penguncian adalah kasusnya (bisa jadi sebaliknya). Ini memecahkan masalah saya.

Rajiv Nair
sumber
2

Saya mendapat pesan kesalahan yang sama. Akhirnya saya menemukan saya salah mengeja nama tabel di perintah:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

melawan

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

Saya bertanya-tanya mengapa MySQL tidak bisa mengatakan tabel seperti itu tidak ada ...

Csongor Halmai
sumber
1

MyISAM baru saja disebutkan. Cukup coba tambahkan ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; di akhir pernyataan, dengan asumsi bahwa tabel Anda yang lain dibuat dengan MyISAM.

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Damir Olejar
sumber
1

Dalam kasus saya, itu terjadi ketika satu tabel adalah InnoB dan lainnya adalah MyISAM. Mengubah mesin satu tabel, melalui MySQL Workbench, menyelesaikannya untuk saya.

rkawano
sumber
1

Itu terjadi dalam kasus saya, karena nama tabel yang direferensikan dalam deklarasi kendala tidak benar (saya lupa huruf besar dalam nama tabel):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Abdellah Alaoui
sumber
1

periksa kedua tabel memiliki skema yang sama InnoDB MyISAM. Saya membuat semuanya sama dalam kasus saya InnoDB dan bekerja

Brian Sanchez
sumber
1

Masalah saya tidak terdaftar, itu sangat konyol ..... Tabel yang memiliki FKPK adalah komposit PKyang dinyatakan seperti ini: kunci primer ( CNPJ, CEP) Saya ingin kolom CEP ada FKdi tabel lain dan saya terjebak dalam kesalahan ini, moral cerita baru saja membalikkan kode di atas untuk kunci Primer ( CEP, CNPJ) dan berhasil. Dapatkan tip teman mereka.

homo willys
sumber