Ответ 1
Вы можете, конечно, выбрать * таблицу в таблице temp, отбросить и воссоздать ее, а затем скопировать обратно.
В mySQL 5 есть ли способ удалить все ограничения внешнего ключа в таблице с помощью одного оператора SQL без ссылки на них по имени?
Я пишу обновление БД script, и, к сожалению, некоторые из сайтов имели ограничения, созданные с "неправильными" именами. Я пытаюсь избежать ввода и получения фактических имен ограничений из БД и вставки их обратно в операторы SQL.
Вы можете, конечно, выбрать * таблицу в таблице temp, отбросить и воссоздать ее, а затем скопировать обратно.
У меня есть решение, похожее на ответ Bing, но он делает еще один шаг для автоматического и многоразового использования в процедуре.
DROP PROCEDURE IF EXISTS dropForeignKeysFromTable;
delimiter ///
create procedure dropForeignKeysFromTable(IN param_table_schema varchar(255), IN param_table_name varchar(255))
begin
declare done int default FALSE;
declare dropCommand varchar(255);
declare dropCur cursor for
select concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name, ';')
from information_schema.table_constraints
where constraint_type='FOREIGN KEY'
and table_name = param_table_name
and table_schema = param_table_schema;
declare continue handler for not found set done = true;
open dropCur;
read_loop: loop
fetch dropCur into dropCommand;
if done then
leave read_loop;
end if;
set @sdropCommand = dropCommand;
prepare dropClientUpdateKeyStmt from @sdropCommand;
execute dropClientUpdateKeyStmt;
deallocate prepare dropClientUpdateKeyStmt;
end loop;
close dropCur;
end///
delimiter ;
Так как подготовленный оператор может обрабатывать только один оператор за раз, процедура циклически перемещается по внешним ключам с помощью курсора и выполняет каждую каплю по одному.
Чтобы использовать процедуру в одной из ваших таблиц, просто используйте следующее, заменив table_schema и table_name вашими значениями:
call dropForeignKeysFromTable('table_schema', 'table_name');
Здесь выбирается, который создает полное удаление и создает инструкции для всех отношений в таблице. Неавтоматично, но достаточно легко скопировать/вставить из.
SELECT `DROP`,`CREATE` FROM (
SELECT
CONCAT("ALTER TABLE `", `K`.`TABLE_NAME`, "` DROP FOREIGN KEY `", `K`.`CONSTRAINT_NAME`, "`;") "DROP",
CONCAT("ALTER TABLE `",
`K`.`TABLE_NAME`,
"` ADD CONSTRAINT ",
"`fk_",
`K`.`TABLE_NAME`,
"_",
`K`.`REFERENCED_TABLE_NAME`,
"1",
"` FOREIGN KEY (`",
`K`.`COLUMN_NAME`,
"`) REFERENCES ",
"`",
`K`.`REFERENCED_TABLE_SCHEMA`,
"`.`",
`K`.`REFERENCED_TABLE_NAME`,
"` (`",
`K`.`REFERENCED_COLUMN_NAME`,
"`) ON DELETE ",
`C`.`DELETE_RULE`,
" ON UPDATE ",
`C`.`UPDATE_RULE`,
";") "CREATE"
FROM `information_schema`.`KEY_COLUMN_USAGE` `K`
LEFT JOIN `information_schema`.`REFERENTIAL_CONSTRAINTS` `C` USING (`CONSTRAINT_NAME`)
WHERE `K`.`REFERENCED_TABLE_SCHEMA` = "your_db"
AND `K`.`REFERENCED_TABLE_NAME` = "your_table") AS DropCreateConstraints
Я использовал его, чтобы удалить все отношения, изменить типы данных на ключах, а затем восстановить отношения с именами внешних ключей á la MySQL Workbench. Может быть полезно кому-то..
В вашем script вы всегда можете добавить SET FOREIGN_KEY_CHECKS = 0, если вы просто хотите обойти ограничения.
Кроме того, я всегда удалял ограничения для каждого ограничения, используя:
ALTER TABLE <table_name> DROP FOREIGN KEY <key_name>;
Я не думаю, что вы можете сделать все сразу, и я не мог найти примеров, которые показывают, что вы можете.
Вы можете использовать этот простой bash script:
Run:
sh deleteForeignKeys.sh
и deleteForeignKeys.sh
#!/bin/bash
dbname="databasename"
table="tablename"
mysqlconn="mysql -u username -ppassword -h host"
tableschema=$($mysqlconn -N -e "SHOW CREATE TABLE $dbname.$table")
#Foreign Keys
fks=$(echo $tableschema | grep -oP '(?<=CONSTRAINT `).*?(?=` FOREIGN KEY)')
for fk in $fks;
do
# DROP FOREIGN KEY
$mysqlconn -e "ALTER TABLE $dbname.$table DROP FOREIGN KEY $fk";
done