首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySql中删除未命名的外键

问在MySql中删除未命名的外键
EN

Stack Overflow用户
提问于 2012-12-13 17:38:09
回答 4查看 10.8K关注 0票数 16

如果外键是在没有名称的情况下创建的,MySql会给它一个默认名称。例如,对于表'Test‘,外键将被命名为'test_ibfk_1’。当我使用这个名称在本地删除外键时,它的工作方式很不错,但是在开发服务器上失败,出现errno: 152。

我知道这个名称区分大小写,但无论是小写还是大写,结果都是一样的。

我的问题是:依赖默认名称操作约束(至少在MySql中)安全吗?

提前感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-13 18:03:10

您需要知道外键的名称。如果它是在没有名称的情况下创建的,则会自动生成名称。您应该获得有关外键的信息。

使用以下查询之一获取外键名称-

代码语言:javascript
复制
SELECT
  constraint_name
FROM
  information_schema.REFERENTIAL_CONSTRAINTS
WHERE
  constraint_schema = <'db_name'> AND table_name = <'table_name'>;


SELECT *
FROM
  information_schema.KEY_COLUMN_USAGE
WHERE
  constraint_schema = <'db_name'> AND table_name = <'table_name'> AND   
  referenced_table_name IS NOT NULL;

...and使用ALTER TABLE <table_name> DROP INDEX <fk_name>;丢弃外键。

票数 20
EN

Stack Overflow用户

发布于 2017-10-03 17:49:14

匆忙的读者,不会因为这个答案太长而放弃这个答案。你不会找到另一个解决方案,,我保证:)

接受的答案不会丢弃密钥,它只会找到它的名称。要实际删除具有未知名称的键,您需要使用准备好的语句。最通用的解决方案是这个脚本,您可以使用五个变量对其进行自定义:

代码语言:javascript
复制
-- YOU MUST SPECIFY THESE VARIABLES TO FULLY IDENTIFY A CONSTRAINT
SET @table_name = '...';
SET @column_name = '...';
SET @referenced_table_name = '...';
SET @referenced_column_name = '...';
-- make sure to limit queries to a single db schema
SET @db_name = '...'; 

-- find the name of the foreign key and store it in a var
SET @constraint_name = (
    SELECT constraint_name
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE TABLE_NAME = @table_name
        AND COLUMN_NAME = @column_name
        AND CONSTRAINT_SCHEMA = @db_name
        AND referenced_table_name = @referenced_table_name
        AND referenced_column_name = @referenced_column_name);


-- prepare the drop statement in a string and run it
SET @s = concat('alter table ', @table_name, ' drop foreign key ', @constraint_name);

PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
票数 6
EN

Stack Overflow用户

发布于 2016-06-30 23:15:38

您可以在不知道名称的情况下删除,创建一个连接查询并自动执行:

代码语言:javascript
复制
set @s:='';
select @s:=concat(@s, 'alter table ', 'your_table', ' drop foreign key ',CONSTRAINT_NAME, ';')
from information_schema.key_column_usage
where CONSTRAINT_SCHEMA = 'your_database'
  and TABLE_NAME ='your_table'
  and REFERENCED_TABLE_NAME = 'the_foreign_reference_table';
prepare stmt from @s;
execute stmt;

deallocate prepare stmt;

在这种情况下,您不需要知道外键的名称,只需要要删除外键的table_name、数据库名称和引用表。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13856946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档