Apa yang dimaksud dengan kesalahan mysql 1025 (HY000): Kesalahan saat mengubah nama './foo' (errorno: 150)?

160

Saya mencoba ini di mysql:

mysql> alter table region drop column country_id;

Dan mendapatkan ini:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

Ada ide? Benda kunci asing?

Trenton
sumber
@skiphoppy - Apakah Anda mencoba memberikan hadiah kepada jawaban yang sudah diberikan? Apakah itu diizinkan? Atau kasus Anda berbeda, dalam hal ini Anda harus memulai utas lainnya?
Rick James
@ RickJames Ya itu. Namun, skiphoppy harus menambahkan komentarnya di bawah jawaban yang dipilihnya, karena pesan bouty akan hilang ketika hadiah telah berakhir.
RandomSeed

Jawaban:

240

Anda biasanya mendapatkan kesalahan ini jika tabel Anda menggunakan mesin InnoDB. Dalam hal ini Anda harus menjatuhkan kunci asing, dan kemudian lakukan tabel perubahan dan jatuhkan kolom.

Tetapi bagian yang sulit adalah Anda tidak dapat menjatuhkan kunci asing menggunakan nama kolom, tetapi Anda harus menemukan nama yang digunakan untuk mengindeksnya. Untuk menemukan itu, berikan pilihan berikut:

MENUNJUKKAN wilayah TABEL;

Ini akan menunjukkan kepada Anda nama indeks, kira-kira seperti ini:

region_ibfk_1KUNCI KONSTRA ASING ( country_id) REFERENSI country( id) PADA HAPUS TANPA TINDAKAN PADA PEMBARUAN TANPA TINDAKAN

Sekarang cukup keluarkan:

mengubah wilayah tabel menjatuhkan kunci asing region_ibfk_1;

Dan akhirnya sebuah:

ubah kolom penurunan wilayah tabel country_id;

Dan kamu baik untuk pergi!

Jeshurun
sumber
Perhatikan bahwa Anda juga bisa menjatuhkan kunci asing dan kolom dalam satu permintaan ALTER TABLE;
Valentin Grégoire
bagus! kita harus meninggalkan kunci asing, semuanya akan baik-baik saja! Terima kasih!
Luan D
173

Ini memang kesalahan kunci asing, Anda bisa mengetahuinya menggunakan perror:

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

Untuk mengetahui detail lebih lanjut tentang apa yang gagal, Anda dapat menggunakan SHOW ENGINE INNODB STATUSdan mencari bagian KESALAHAN ASING TERBARU yang berisi rincian tentang apa yang salah.

Dalam kasus Anda, kemungkinan besar ada sesuatu yang merujuk pada kolom country_id.

Harrison Fisk
sumber
2
Sekali lagi, kesalahan tampilan MySQL yang menyesatkan lainnya ... Terima kasih.
e2-e4
Di phpMyAdmin, Anda dapat menemukan status mesin di Storage Engine , InnoDB , InnoDB Status
Maxence
15

Anda juga bisa mendapatkan kesalahan ini dengan mencoba menjatuhkan kunci asing yang tidak ada. Jadi ketika menjatuhkan kunci asing, selalu pastikan itu benar-benar ada.

Jika kunci asing memang ada, dan Anda masih mendapatkan kesalahan ini coba yang berikut ini:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

// Jatuhkan kunci asing di sini!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Ini selalu melakukan trik untuk saya :)

Jeroen
sumber
1
Saya membutuhkan ini saat beralih ke rangkaian karakter tabel yang berbeda, karena kesalahan mysql: ERROR 1025 (HY000): Kesalahan saat mengubah nama './table/#sql-14ae_81' menjadi (errno: 150)
letsjump
7

Cukup jalankan kueri alter tabel menggunakan 'KEY' dan bukan 'FOREIGN KEY' di pernyataan drop. Saya harap ini akan membantu menyelesaikan masalah ini, dan akan menghilangkan batasan kunci asing dan Anda dapat mengubah kolom tabel dan menjatuhkan tabel.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

di sini DROP KEYalih-alih DROP FOREIGN KEY,

Semoga ini bisa membantu.

Terima kasih

Muhammad Sohail
sumber
4

Saya tahu, ini adalah posting lama, tetapi ini adalah hit pertama di mesin pencari favorit semua orang jika Anda mencari kesalahan 1025.

Namun, ada "hack" yang mudah untuk memperbaiki masalah ini:

Sebelum Anda menjalankan perintah, Anda harus terlebih dahulu menonaktifkan pemeriksaan batasan kunci asing menggunakan perintah ini:

SET FOREIGN_KEY_CHECKS = 0;

Kemudian Anda dapat menjalankan perintah Anda.

Setelah Anda selesai, jangan lupa untuk mengaktifkan kembali batasan kunci asing, menggunakan perintah ini:

SET FOREIGN_KEY_CHECKS = 1;

Semoga sukses dengan usaha Anda.

Baccata
sumber
Sedang kesulitan menginstal octobercms di xampp, akhirnya ini membantu.
jahackbeth
2

Saya punya masalah serupa sekali. Saya menghapus kunci utama dari TABEL A tetapi ketika saya mencoba untuk menghapus kolom kunci asing dari tabel BI ditunjukkan kesalahan yang sama di atas.

Anda tidak dapat menjatuhkan kunci asing menggunakan nama kolom dan untuk memotong ini di PHPMyAdmin atau dengan MySQL, pertama-tama hapus batasan kunci asing sebelum mengganti nama atau menghapus atribut.

Joomler
sumber
1

Lihatlah file kesalahan untuk database mysql Anda. Menurut Bug # 26305 sql saya tidak memberi Anda penyebabnya. Bug ini ada sejak MySQL 4.1 ;-)

marabol
sumber
Saya menemukan beberapa jawaban Anda sulit untuk diikuti, tetapi +1 untuk ditautkan ke laporan bug. Rupanya, sekarang sudah diperbaiki di MySQL v5.6.6. :)
mwfearnley
1

Jika Anda menggunakan klien seperti MySQL Workbench, klik kanan tabel yang diinginkan dari mana kunci asing akan dihapus, lalu pilih tab kunci asing dan hapus indeks.

Kemudian Anda dapat menjalankan kueri seperti ini:

alter table table_name drop foreign_key_col_name;
iltaf khalid
sumber
1

Mungkin ada tabel lain dengan kunci asing yang merujuk kunci utama yang Anda coba ubah.

Untuk mengetahui tabel mana yang menyebabkan kesalahan, Anda dapat menjalankan SHOW ENGINE INNODB STATUSdan kemudian melihat LATEST FOREIGN KEY ERRORbagian

Gunakan kategori SHOW CREATE TABLE untuk menampilkan nama kendala.

Kemungkinan besar itu adalah categories_ibfk_1

Gunakan nama untuk menjatuhkan kunci asing terlebih dahulu dan kolom kemudian:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;
youngdero
sumber
1

Perbuatan

SET FOREIGN_KEY_CHECKS=0;

sebelum Operasi juga bisa melakukan trik.

Jan Tchärmän
sumber
0

Saya kira masalah batasan kunci asing. Apakah country_id digunakan sebagai kunci asing di tabel lain?

Saya bukan guru DB tapi saya pikir saya memecahkan masalah seperti ini (di mana ada kendala fk) dengan menghapus fk, melakukan hal-hal tabel perubahan saya dan kemudian mengulang hal-hal fk.

Saya akan tertarik untuk mendengar apa hasilnya - kadang mysql cukup samar.

itsmatt
sumber
Mysql bisa mengerikan. Bagus biasanya, tetapi pesan-pesan kesalahan itu, sheesh. Jika kami mendapatkan penjelasan singkat dari seseorang di kantor, saya akan melemparkannya ke sini.
Trenton
0

Dalam kasus saya, saya menggunakan meja kerja MySQL dan saya menghadapi masalah yang sama saat menjatuhkan salah satu kolom saya dalam sebuah tabel. Saya tidak dapat menemukan nama kunci asing. Saya mengikuti langkah-langkah berikut untuk menyelesaikan masalah:

  1. Rt. klik skema Anda dan pilih 'inspektur skema'. Ini memberi Anda berbagai tabel, kolom, indeks, dll.

  2. Buka tab bernama 'Indeks' dan cari nama kolom di bawah kolom bernama 'Kolom'. Setelah ditemukan periksa nama tabel untuk catatan ini di bawah nama kolom 'Tabel'. Jika cocok dengan nama tabel yang Anda inginkan, maka catat nama kunci asing dari kolom bernama 'Nama'.

  3. Sekarang jalankan query: ALTER table tableNamexx DROP KEY foreignKeyName;

  4. Sekarang Anda dapat menjalankan pernyataan drop yang akan berhasil dijalankan.

Jatin Shashoo
sumber
0

Saya mendapat kesalahan ini dengan MySQL 5.6 tetapi tidak ada hubungannya dengan kunci Asing. Ini pada mesin Windows 7 Professional yang bertindak sebagai server pada LAN kecil.

Aplikasi klien sedang melakukan operasi batch yang membuat tabel mengisinya dengan beberapa data eksternal kemudian menjalankan kueri bergabung dengan tabel permanen kemudian menjatuhkan tabel "sementara". Batch ini melakukan ini sekitar 300 kali dan rutin khusus ini telah berjalan selama seminggu selama beberapa tahun ketika tiba-tiba kita mendapatkan Galat 1025 Tidak dapat mengubah nama masalah pada titik acak dalam bets.

Dalam kasus saya, aplikasi menggunakan 4 pernyataan DDL, CREATE TABLE diikuti oleh 3 CREATE INDEX, tidak ada kunci asing. Namun hanya 2 indeks yang benar-benar dibuat dan file tabel .frm yang sebenarnya diganti nama, pada titik kegagalan.

Solusi saya adalah menyingkirkan pernyataan CREATE INDEX yang terpisah dan membuatnya menggunakan pernyataan CREATE TABLE. Ini pada saat penulisan ini telah memecahkan masalah bagi saya dan bantuan saya orang lain menggaruk-garuk kepala ketika mereka menemukan utas ini.

Chris Millard
sumber
-2

averageRatings = FOREACH groupedRatings GENERATE group AS movieID, AVG (ratings.rating) AS avgRating, COUNT (ratings.rating) AS numRatings;

Jika Anda menggunakan perintah seperti di atas, Anda harus menggunakan grup dalam huruf kecil. Ini dapat memecahkan masalah Anda, itu memecahkan masalah saya. Setidaknya dalam skrip PIG.

Naman Dhameja
sumber
Saya tidak berpikir ini terkait masalah, dia memukul masalah mysql
Zdenek Machek