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

deepu sankar
sumber
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
Bohemian
sumber
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`;
Wellington Lorindo
sumber
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.

Lothar
sumber
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 ...

Robert Knight
sumber
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;

roelleor
sumber
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`;
jbobbins
sumber
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.

ahli piscator
sumber
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/

Markus Barthlen
sumber
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.
Akshay Sharma
sumber
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;
Youness HARDI
sumber
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

Lukasz Szozda
sumber
-4

ini akan berfungsi pada MySQL untuk menghilangkan batasan

alter table tablename drop primary key;

alter table tablename drop foreign key;
Ranjitha
sumber
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