查询以查找外键

时间:2011-10-14 09:42:25

标签: mysql foreign-keys

我有一个数据库,我需要删除一些外键,但我事先不知道外键是否仍然存在。

我发现了一些可以解决问题的存储过程(http://forums.mysql.com/read.php?97,218825,247526),但我不想为此创建存储过程。

我尝试在存储过程中使用查询,但是使用“IF EXISTS(SELECT NULL FROM etc ...等等)我得到错误

我是否只能在存储过程中使用IF EXISTS


现在,我唯一可以运行的是

SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' 
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';

我也试过这个

IF EXISTS (SELECT NULL FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() AND CONSTRAINT_NAME = parm_key_name) THEN
(...) do something (...)
END IF; 

但我得到You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF' at line 1

我在简单查询的论坛中查找了一些示例,我无法理解为什么这不起作用。

注意:编辑以更正损坏的链接

3 个答案:

答案 0 :(得分:7)

您需要连接到信息方案,您可以在此表中找到有关主键和外键的所有信息

SELECT * FROM information_schema.TABLE_CONSTRAINTS T;

您需要成为ROOT用户才能访问information_schema

使用此表,您可以找到表,db以及是否有外键。

如果您不想使用IF EXIST和存储过程,希望这会有所帮助。但我肯定你可以使用IF EXIST可以用于非存储过程查询....

答案 1 :(得分:1)

为什么不使用表“INFORMATION_SCHEMA”呢?

SELECT *
FROM `TABLE_CONSTRAINTS`
WHERE `CONSTRAINT_TYPE` = 'FOREIGN KEY'

答案 2 :(得分:1)

您需要连接到信息方案,您可以在此表中找到有关主键和外键的所有信息

 select
        concat(table_name, '.', column_name) as 'foreign key',  
        concat(referenced_table_name, '.', referenced_column_name) as 'references'
    from
        information_schema.key_column_usage
    where
        referenced_table_name is not null;
  

帮助:请参阅此链接list-foreign-keys-in-mysql