วิธีลบข้อ จำกัด ออกจากตาราง MySQL ของฉัน


252

ฉันต้องการลบข้อ จำกัด ออกจากตารางของฉัน คำถามของฉันคือ:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

แต่ฉันได้รับข้อผิดพลาด:

#1064- คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับรุ่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องเพื่อใช้ใกล้กับ 'ข้อ จำกัดFK_tbl_magazine_issue_mst_users' ที่บรรทัดที่ 1


1
เป็นที่น่าสังเกตว่าถ้าคุณสร้างCHECKข้อ จำกัด คุณไม่จำเป็นต้องทิ้งเพราะไม่มีข้อ จำกัด จริง ๆ คุณสามารถเลือกจากinformation_schema.table_constraintsเพื่อตรวจสอบและคุณสามารถเรียกใช้add constraintซ้ำแล้วซ้ำอีกโดยไม่มีข้อผิดพลาดใด ๆ MySQL ไม่สนับสนุนCHECKข้อ จำกัด แต่อนุญาตให้ SQL ตั้งใจสร้างมัน (โดยไม่ต้องสร้างข้อ จำกัด )
ADTC


เป็นไปได้ที่ซ้ำกันของการลบคีย์หลักใน MySQL
瑲瑲

ไวยากรณ์ของคุณใช้ได้อย่างถูกต้องและตอนนี้มันรองรับการสาธิตแล้ว
Lukasz Szozda

คำตอบ:


423

Mysql มีรูปแบบพิเศษสำหรับวางข้อ จำกัด คีย์ต่างประเทศ:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

21
Postgres, MSSQL, และ Oracle alter table .. drop constraintทุกคนต้องมี MySQL เป็นสิ่งที่แปลกมาก
Jared Beck

มันบอกว่ามันไม่สามารถวาง beacuses "column2" ที่ต้องการในข้อ จำกัด ของ foreign key เมื่อฉันทำตามที่คุณบอกว่าผมได้รับ "คันธ DROP column2; ตรวจสอบว่าคอลัมน์ / สำคัญที่มีอยู่"
Lealo

เอาล่ะฉันเข้าใจแล้วสิ่งแปลกปลอมเป็นสิ่งที่แยกจากกันเพียงแค่เชื่อมคอลัมน์กับคอลัมน์ตารางอื่น ๆ ฉันมีชื่อมาตรฐานให้กับมัน ตอนนี้ฉันสามารถวางกุญแจต่างประเทศได้อย่างปลอดภัยโดยไม่ทิ้งคอลัมน์ไว้
Lealo

1
คำตอบของเวลลิงตัน Lorindo นั้นถูกต้องมากกว่าเพราะการลบคีย์ต่างประเทศออกจะไม่ลบดัชนีที่เกี่ยวข้องออก แน่นอนว่าดัชนีนั้นอาจถูกสร้างแยกต่างหาก แต่ถ้ามันถูกสร้างขึ้นจากการเพิ่ม foreign key ในตอนแรกมันจะไม่ถูกลบออกง่ายๆโดยการวาง foreign key
Rich Harding

55

ฉันมีปัญหาเดียวกันและฉันต้องแก้ไขด้วยรหัสนี้:

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

2
สิ่งนี้อาจถูกมองว่าถูกต้องมากกว่าโซลูชันที่ยอมรับเนื่องจากการลบคีย์ภายนอกจะไม่ลบดัชนี แน่นอนว่าดัชนีนั้นอาจถูกสร้างแยกต่างหาก แต่ถ้ามันถูกสร้างขึ้นจากการเพิ่ม foreign key ในตอนแรกมันจะไม่ถูกลบออกง่ายๆโดยการวาง foreign key
Rich Harding

3
เป็นคำสั่งเดียว: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte


12

หากข้อ จำกัด ไม่ใช่คีย์ภาษาต่างประเทศเช่น เพิ่มเข้ามาโดยใช้ 'UNIQUE CONSTRAINT (colA, colB)' แล้วมันเป็นดัชนีที่สามารถทิ้งโดยใช้ALTER TABLE ... DROP INDEX ...


9

ดีมาก, คุณสามารถปิดการใช้งานการตรวจสอบกุญแจต่างประเทศทั้งหมดชั่วคราวจากฐานข้อมูล mysql: SET FOREIGN_KEY_CHECKS=0; และเพื่อเปิดใช้งานอีกครั้ง: SET FOREIGN_KEY_CHECKS=1;


8

ในการเพิ่มคำตอบเล็ก ๆ น้อย ๆ ของ Robert Knight เนื่องจากชื่อของโพสต์นั้นไม่ได้กล่าวถึงกุญแจต่างประเทศ (และเนื่องจากเขาไม่มีตัวอย่างโค้ดที่สมบูรณ์และเนื่องจากบล็อคโค้ดความคิดเห็นของ SO ไม่แสดงเช่นเดียวกับโค้ดของคำตอบ บล็อก) ฉันจะเพิ่มสิ่งนี้สำหรับข้อ จำกัด ที่ไม่ซ้ำกัน งานเหล่านี้เพื่อลดข้อ จำกัด :

ALTER TABLE `table_name` DROP KEY `uc_name`;

หรือ

ALTER TABLE `table_name` DROP INDEX `uc_name`;

4

ORM หรือเฟรมเวิร์กบางตัวใช้หลักการตั้งชื่อที่แตกต่างกันสำหรับคีย์ต่างประเทศกว่าค่าเริ่มต้น FK_[parent table]_[referenced table]_[referencing field]เนื่องจากสามารถเปลี่ยนแปลงได้

Laravel เช่นใช้[parent table]_[referencing field]_foreignเป็นแบบแผนการตั้งชื่อ คุณสามารถแสดงชื่อของคีย์ต่างประเทศโดยใช้แบบสอบถามนี้ดังที่แสดงที่นี่ :

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

จากนั้นให้ลบคีย์ต่างประเทศออกโดยเรียกใช้คิวรี DROP FOREIGN KEY ก่อนหน้านี้และชื่อที่ถูกต้อง


2

สำหรับผู้ที่มาที่นี่โดยใช้ MariaDB:

โปรดทราบว่า MariaDB อนุญาตให้ใช้คำสั่ง DROP CONSTRAINT โดยทั่วไปตัวอย่างเช่นสำหรับการปล่อยข้อ จำกัด การตรวจสอบ:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

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


ใช่นี้เป็นข้อ จำกัด CONSTRAINT CHECK(a > b)ที่อยู่ในตารางเดียวกันตัวอย่างเช่น สำหรับข้อ จำกัด กุญแจต่างประเทศดูเหมือนว่าคุณยังต้องการDROP FOREIGN KEYไวยากรณ์อย่างน้อยใน MariaDB เวอร์ชัน 10.2
Frank Forte

1
  1. ไปที่มุมมองโครงสร้างของตาราง
  2. คุณจะเห็น 2 ตัวเลือกที่ด้านบน a.Table structure b. มุมมองความสัมพันธ์
  3. ตอนนี้คลิกที่มุมมองความสัมพันธ์ที่นี่คุณสามารถวางข้อ จำกัด กุญแจต่างประเทศของคุณ คุณจะได้รับความสัมพันธ์ทั้งหมดที่นี่

เยี่ยมมากทำงานให้ฉันเมื่อคุณไม่รู้จัก id
Silviu St


0

วิธีที่ง่ายที่สุดในการลบข้อ จำกัด คือใช้ไวยากรณ์ที่ALTER TABLE tbl_name DROP CONSTRAINT symbol;แนะนำในMySQL 8.0.19 :

ในฐานะของ MySQL 8.0.19, ALTER TABLE อนุญาตให้ใช้ไวยากรณ์ (และมาตรฐาน SQL) ทั่วไปมากขึ้นสำหรับการปล่อยและการแก้ไขข้อ จำกัด ที่มีอยู่ประเภทใดประเภทหนึ่งโดยที่ประเภทข้อ จำกัด จะถูกกำหนดจากชื่อข้อ จำกัด

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> การสาธิตซอ


-4

สิ่งนี้จะทำงานบน MySQL เพื่อลดข้อ จำกัด

alter table tablename drop primary key;

alter table tablename drop foreign key;

DROP PRIMARY KEYไม่ควรทำงาน DROP FOREIGN KEYผลงาน dropแต่คุณจำเป็นต้องระบุมีการ ตัวอย่างเช่นALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.