我有一个数据库,我需要删除一些外键,但我事先不知道外键是否仍然存在。
我发现了一些可以解决问题的存储过程(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
我在简单查询的论坛中查找了一些示例,我无法理解为什么这不起作用。
注意:编辑以更正损坏的链接
答案 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