MySQL Menghapus Beberapa Kunci Asing


190

Saya punya tabel yang kunci utamanya digunakan di beberapa tabel lain dan memiliki beberapa kunci asing ke tabel lain.

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

Masalahnya adalah ketika saya mencoba untuk menjatuhkan salah satu kolom kunci asing (yaitu locationIDX) itu memberi saya kesalahan.

"ERROR 1025 (HY000): Kesalahan saat mengganti nama"

Bagaimana saya bisa menjatuhkan kolom di tabel tugas di atas tanpa mendapatkan kesalahan ini?

Jawaban:


447

Seperti dijelaskan di sini , tampaknya batasan kunci asing harus dijatuhkan oleh nama kendala dan bukan nama indeks. Sintaksnya adalah:

alter table footable drop foreign key fooconstraint

35
Ini masalah saya. Saya merasa agak bodoh sekarang. Jika ada orang lain yang memiliki masalah ini, Anda dapat menemukan nama Batasan Kunci Asing dengan menggunakan fungsi SHOW CREATE TABLE.
Drew

14
Kiat: gunakan SHOW CREATE TABLE footable;untuk melihat apa nama batasannya. Itu bukan nama kolom itu sendiri. Terima kasih atas jawabannya!
Chris Baker

2
Anda dapat menggunakan ini untuk menemukan batasan kunci asing: SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '<nama db Anda>' DAN constraint_type = 'KUNCI LUAR NEGERI'
Gayan Dasanayake

21

Kunci asing ada untuk memastikan integritas data, jadi Anda tidak bisa menjatuhkan kolom selama itu bagian dari kunci asing. Anda harus menjatuhkan kunci terlebih dahulu.

Saya akan berpikir pertanyaan berikut akan melakukannya:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

Seperti semua orang katakan di atas, Anda dapat dengan mudah menghapus FK. Namun, saya hanya memperhatikan bahwa mungkin perlu untuk menjatuhkan KUNCI itu sendiri di beberapa titik. Jika Anda memiliki pesan kesalahan untuk membuat indeks lain seperti yang terakhir, maksud saya dengan nama yang sama, akan berguna untuk menghapus semua yang terkait dengan indeks itu.

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above

10

Periksa apa nama CONSTRAINT dan nama KUNCI ASING:

SHOW CREATE TABLE table_name;

Hapus nama CONSTRAINT dan nama KUNCI ASING:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

Semoga ini membantu!


4

Inilah cara untuk menghilangkan batasan kunci asing, itu akan berhasil. ALTER TABEL location. location_id KUNCI KUNINGAN ASING location_ibfk_1;


2

Hai saya mengikuti beberapa urutan di atas, dan menemukan beberapa solusi.

SHOW CREATE TABLE footable;

Anda akan mendapatkan Nama Pembatas FK seperti

ProjectsInfo_ibfk_1

Sekarang Anda harus menghapus batasan ini. dengan mengubah tabel commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Lalu jatuhkan kolom tabel,

alter table ProjectsInfo drop column clientId;

1

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 satu baris, di sudut kiri atas klik opsi +, klik tombol teks lengkap raio lalu klik go. Di sana Anda akan mendapatkan nama indeks, seperti ini:

CONSTRAINT region_ibfk_1 KUNCI ASING (country_id) REFERENSI negara (id) PADA HAPUS TANPA TINDAKAN PADA PEMBARUAN TANPA TINDAKAN Sekarang cukup keluarkan:

ubah region table drop foreign key region_ibfk_1;

atau

lebih sederhana cukup ketik: - ubah table TableName drop kunci asing TableName_ibfk_1 ;

ingat satu-satunya adalah menambahkan _ibfk_1 setelah tablename Anda menjadi seperti ini: - TableName _ibfk_1


0

Anda tidak dapat menjatuhkan kolom kunci asing karena direferensikan dari tabel assignmentStuff. Jadi, Anda harus terlebih dahulu menjatuhkan batasan kunci asing assignmentStuff.assignmentIDX.

Pertanyaan serupa sudah diajukan di sini . Periksa juga di sini untuk info lebih lanjut.


1
Jadi, karena assignmentStuff mereferensikan primary key assignment, saya tidak bisa menghapus kolom locationID assignment? Ini sepertinya kontra intuitif.
Drew

Sepertinya saya sudah mengganti beberapa nama kolom sehingga jawaban saya tidak masuk akal. Maaf untuk itu ...
Ronald Wildenberg


0

Langkah 1: show create table vendor_locations;

Langkah 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

itu berhasil untuk saya.


0

kebutuhan pertama untuk mendapatkan nama batasan aktual oleh kueri ini

SHOW CREATE TABLE TABLE_NAME

Kueri ini akan menghasilkan batasan nama kunci asing, sekarang kueri di bawah ini akan menjatuhkannya.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

angka terakhir dalam nama batasan di atas tergantung pada berapa banyak kunci asing yang Anda miliki dalam tabel

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.