Bagaimana cara menghapus batasan dari tabel MySQL saya?


252

Saya ingin menghapus kendala dari meja saya. Kueri saya adalah:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Tapi saya mendapat kesalahan:

#1064- Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'kendala FK_tbl_magazine_issue_mst_users' di baris 1


1
Perlu dicatat bahwa jika Anda membuat CHECKbatasan, tidak perlu menjatuhkannya karena tidak ada batasan yang sebenarnya dibuat. Anda dapat memilih dari information_schema.table_constraintsuntuk memverifikasi, dan Anda bahkan dapat menjalankan add constraintberulang-ulang tanpa kesalahan. MySQL tidak mendukung CHECKkendala tetapi memungkinkan SQL yang dimaksudkan untuk membuatnya (tanpa benar-benar membuat kendala).
ADTC


Kemungkinan duplikat Hapus Kunci Utama di MySQL
劉鎮 瑲

Sintaks Anda sangat valid dan sekarang didukung demo
Lukasz Szozda

Jawaban:


423

Mysql memiliki sintaks khusus untuk menjatuhkan batasan kunci asing:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

21
Postgres, MSSQL, dan Oracle semuanya alter table .. drop constraint. MySQL adalah yang aneh, sepertinya.
Jared Beck

Dikatakan ia tidak dapat menjatuhkan "kolom2" karena itu diperlukan dalam batasan kunci asing. Ketika saya melakukan apa yang Anda katakan, saya mendapatkan "Cant DROP column2; periksa apakah ada kolom / kunci"
Lealo

Baiklah saya mengerti, orang asing adalah hal yang terpisah hanya menghubungkan kolom ke kolom tabel lainnya. Milik saya memiliki nama standar yang diberikan kepadanya. Juga sekarang saya sekarang bahwa Anda dapat menjatuhkan kunci asing dengan aman tanpa kolom itu sendiri dijatuhkan
Lealo

1
Solusi Wellington Lorindo bisa dianggap lebih benar, karena hanya menghapus kunci asing tidak akan menghapus indeks terkait. Tentu saja indeks mungkin telah dibuat secara terpisah, tetapi jika itu dibuat sebagai konsekuensi dari menambahkan kunci asing di tempat pertama, maka itu tidak akan dihapus hanya dengan menjatuhkan kunci asing.
Rich Harding

55

Saya memiliki masalah yang sama dan saya harus menyelesaikannya dengan kode ini:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;

2
Ini bisa dilihat sebagai lebih benar daripada solusi yang diterima, karena hanya menghapus kunci asing tidak akan menghapus indeks. Tentu saja indeks mungkin telah dibuat secara terpisah, tetapi jika itu dibuat sebagai konsekuensi dari menambahkan kunci asing di tempat pertama maka itu tidak akan dihapus hanya dengan menjatuhkan kunci asing.
Rich Harding

3
Sebagai satu perintah: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte

26

Tidak ada yang namanya DROP CONSTRAINTdi MySQL. Dalam kasus Anda, Anda bisa menggunakannya DROP FOREIGN KEY.


12

Jika kendala bukan kunci asing, mis. satu ditambahkan menggunakan 'CONSTRAINT UNIK (colA, colB)' maka itu adalah indeks yang dapat dijatuhkan menggunakanALTER TABLE ... DROP INDEX ...


9

Juga bagus, Anda dapat menonaktifkan sementara semua pemeriksaan kunci asing dari database mysql: SET FOREIGN_KEY_CHECKS=0; Dan untuk mengaktifkannya lagi: SET FOREIGN_KEY_CHECKS=1;


8

Untuk menambahkan sedikit ke jawaban Robert Knight, karena judul posting itu sendiri tidak menyebutkan kunci asing (dan karena itu tidak memiliki sampel kode lengkap dan karena blok kode komentar SO tidak menunjukkan serta kode jawaban ' blok), saya akan menambahkan ini untuk batasan unik . Salah satu dari ini bekerja untuk menghilangkan batasan:

ALTER TABLE `table_name` DROP KEY `uc_name`;

atau

ALTER TABLE `table_name` DROP INDEX `uc_name`;

4

Beberapa ORM atau kerangka kerja menggunakan konvensi penamaan yang berbeda untuk kunci asing daripada standar FK_[parent table]_[referenced table]_[referencing field], karena mereka dapat diubah.

Laravel misalnya digunakan [parent table]_[referencing field]_foreignsebagai konvensi penamaan. Anda dapat menampilkan nama kunci asing dengan menggunakan kueri ini, seperti yang ditunjukkan di sini :

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

Kemudian hapus kunci asing dengan menjalankan permintaan DROP FOREIGN KEY yang disebutkan sebelumnya dan nama yang tepat.


2

Bagi yang datang ke sini menggunakan MariaDB:

Perhatikan bahwa MariaDB memungkinkan pernyataan DROP CONSTRAINT secara umum, misalnya untuk menjatuhkan batasan pemeriksaan:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/library/alter-table/


Ya, ini untuk kendala yang ada dalam tabel yang sama, misalnya CONSTRAINT CHECK(a > b). Untuk batasan kunci asing, tampaknya Anda masih memerlukan DROP FOREIGN KEYsintaks, setidaknya dalam MariaDB versi 10.2
Frank Forte

1
  1. Pergi ke tampilan struktur tabel
  2. Anda akan melihat 2 opsi di atas. Struktur tabel b. Tampilan relasi .
  3. Sekarang klik pada Relation view , di sini Anda dapat menjatuhkan batasan kunci asing Anda. Anda akan mendapatkan semua relasi di sini.

Itu bagus, bekerja untuk saya ketika Anda tidak tahu id
Silviu St

0

Tidak ada DROP CONSTRAINTDi MySql. Ini bekerja seperti sulap di mysql 5.7

ALTER TABLE answer DROP KEY const_name;

0

Cara paling sederhana untuk menghilangkan kendala adalah dengan menggunakan sintaks yang ALTER TABLE tbl_name DROP CONSTRAINT symbol;diperkenalkan di MySQL 8.0.19 :

Pada MySQL 8.0.19, ALTER TABLE memungkinkan sintaksis yang lebih umum (dan SQL standar) untuk menjatuhkan dan mengubah batasan yang ada dari semua jenis, di mana jenis kendala ditentukan dari nama kendala

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> demo biola


-4

ini akan berfungsi pada MySQL untuk menghilangkan batasan

alter table tablename drop primary key;

alter table tablename drop foreign key;

DROP PRIMARY KEYseharusnya tidak bekerja. DROP FOREIGN KEYberfungsi tetapi Anda harus menentukan untuk siapa drop. MisalnyaALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre
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.