Як видалити обмеження з моєї таблиці 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



Ваш синтаксис є дійсно дійсним, і тепер він підтримується демо
Lukasz Szozda

Відповіді:


423

У Mysql є спеціальний синтаксис для скасування обмежень іноземних ключів:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

21
Постгреси, MSSQL і Oracle все є alter table .. drop constraint. Здається, MySQL незвичайний.
Джаред Бек

Він говорить про те, що він не може скинути символи "column2", оскільки він потрібен з обмеженням зовнішнього ключа. Коли я, як ви говорите, отримую "Cant DROP column2; перевірте, чи існує колонка / ключ"
Lealo

Добре, що я зрозумів, іноземне - це окрема річ, яка просто з'єднує стовпчик з колонами інших таблиць. Міна мала стандартну назву, яку їй дали. Також тепер я тепер, коли ви можете безпечно скинути сторонні ключі, не втрачаючи стовпця
Lealo

1
Рішення Веллінгтона Лоріндо можна вважати більш правильним, оскільки просто видалення стороннього ключа не видалить відповідний індекс. Звичайно, індекс, можливо, був створений окремо, але якщо він був створений як наслідок додавання іноземного ключа в першу чергу, він не буде видалений, просто скинувши зовнішній ключ.
Річ Хардінг

55

У мене була така ж проблема, і я вирішив вирішити цей код:

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

2
Це може розглядатися як більш правильне, ніж прийняте рішення, оскільки просто видалення стороннього ключа не видалить індекс. Звичайно, індекс, можливо, був створений окремо, але якщо він був створений як наслідок додавання іноземного ключа в першу чергу, він не буде видалений, просто скинувши зовнішній ключ.
Річ Хардінг

3
Як єдину команду: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Френк Форте

26

Немає такої речі, як DROP CONSTRAINTу MySQL. У вашому випадку ви можете використовувати DROP FOREIGN KEYзамість цього.


12

Якщо обмеження не є стороннім ключем, наприклад. один доданий за допомогою "UNIQUE CONSTRAINT (colA, colB)", то це індекс, який можна скинути за допомогоюALTER TABLE ... DROP INDEX ...


9

Також добре, ви можете тимчасово відключити всі перевірки зовнішніх ключів із бази даних mysql: SET FOREIGN_KEY_CHECKS=0; І знову включити: SET FOREIGN_KEY_CHECKS=1;


8

Щоб додати трохи до відповіді Роберта Найта, оскільки сама назва публікації не містить згадок про іноземні ключі (а оскільки в нього немає повних зразків коду і оскільки блоки коментування 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
Франк Форте

1
  1. Перейдіть до структури структури таблиці
  2. Ви побачите 2 варіанти вгорі a.Таблиця b. Вид відношення .
  3. Тепер натисніть на перегляд відносин , тут ви можете скинути обмеження на зовнішній ключ. Ви отримаєте тут усі стосунки.

Це чудово, працював для мене, коли ти не знаєш ідентифікатора
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
Руссо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.