Вопрос по alter, foreign-keys, constraints, mysql – Как удалить ограничения из моей таблицы MySQL?

213

Я хочу удалить ограничения из моей таблицы. Мой запрос:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Но я получил ошибку:

#1064 - у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с ограничениемFK_tbl_magazine_issue_mst_usersв строке 1

Возможный дубликатУдалить первичный ключ в MySQL 劉鎮瑲
Стоит отметить, что если вы создалиCHECK ограничение, нет необходимости удалять его, потому что фактическое ограничение не создается. Вы можете выбрать изinformation_schema.table_constraints проверить, и вы даже можете запуститьadd constraint снова и снова без каких-либо ошибок. MySQL не поддерживаетCHECK ограничения, но позволяет SQL, предназначенный для их создания (без фактического создания ограничений). ADTC

Ваш Ответ

10   ответов
1

Обратите внимание, что 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
24

DROP CONSTRAINT в MySQL. В вашем случае вы могли бы использоватьDROP FOREIGN KEY вместо.

3

что вы можете временно отключить все проверки внешнего ключа из базы данных mysql:SET FOREIGN_KEY_CHECKS=0; И чтобы включить его снова:SET FOREIGN_KEY_CHECKS=1;

4

поскольку в заголовке поста не упоминаются внешние ключи (и поскольку он не имеет полных примеров кода, а блоки кода комментария SO не отображаются так же, как и код ответов блоки), я добавлю это дляуникальный ограничения. Любая из этих работ, чтобы снять ограничение:

ALTER TABLE `table_name` DROP KEY `uc_name`;

или же

ALTER TABLE `table_name` DROP INDEX `uc_name`;
43

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;
Это можно рассматривать как более правильное, чем принятое решение, поскольку простое удаление внешнего ключа не приведет к удалению индекса. Конечно, индекс, возможно, был создан отдельно, но если он был создан в результате добавления внешнего ключа, то он не будет удален простым удалением внешнего ключа. Rich Harding
Как одна команда:ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk; Frank Forte
378

юча:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users
Решение Веллингтона Лориндо можно рассматривать как более правильное, потому что простое удаление внешнего ключа не удалит связанный индекс. Конечно, индекс, возможно, был создан отдельно, но если он был создан в результате добавления внешнего ключа, то он не будет удален простым удалением внешнего ключа. Rich Harding
Хорошо, я понял, что чужое - это отдельная вещь, просто соединяющая столбец с другими столбцами таблиц. У меня было стандартное имя, данное ему. Также теперь я теперь, что вы можете безопасно удалять внешние ключи без удаления самого столбца. Lealo
Он говорит, что не может отбрасывать "column2", потому что он необходим в ограничении внешнего ключа. Когда я делаю, как вы говорите, я получаю «Cant DROP column2; проверьте, что столбец / ключ существует» Lealo
Postgres, MSSQL и Oracle имеютalter table .. drop constraint, Похоже, что MySQL - нечетный выход. Jared Beck
1
Перейти к структурному виду таблицы
Вы увидите 2 варианта вверху. Структура таблицы b.Взгляд отношения.
Теперь нажмите наВзгляд отношения здесь вы можете удалить ограничение внешнего ключа. Вы получите все отношения здесь.
Это здорово, сработало для меня, когда вы не знаете идентификатор Silviu St
-4

чтобы снять ограничения

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
2

внешних ключей, чем по умолчанию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 и его собственное имя.

11

например. один добавляется с помощью «UNIQUE CONSTRAINT (colA, colB)», тогда это индекс, который можно удалить с помощьюALTER TABLE ... DROP INDEX ...

Похожие вопросы