2011-10-14 18 views
6

Tengo una base de datos donde necesito soltar algunas claves externas, pero no sé de antemano si las claves externas todavía existen.Consulta para encontrar claves externas

He encontrado algunos procedimientos almacenados (http://forums.mysql.com/read.php?97,218825,247526) que hacen el truco, pero no quiero crear un procedimiento almacenado para esto.

He tratado de utilizar la consulta dentro del procedimiento almacenado, pero me da un error al usar "SI EXISTE (SELECCIONAR nulos de etc .. etc ...

se puede usar sólo IF EXISTS en los procedimientos almacenados?


en este momento, lo único que puedo correr es

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'; 

y he probado esto también

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

pero me da un 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

he buscado ejemplos en los foros con preguntas sencillas y no puedo tener sentido de por qué esto no está funcionando.

NOTA: Editar para corregir enlace roto

+1

¿Cómo se ve tu consulta? –

+0

¿Qué quiere decir específicamente con "soltar claves externas"? – gview

+0

@ gview algo así como ALTER TABLE 'table' DROP FOREIGN KEY' fk'; –

Respuesta

5

Es necesario conectar al sistema de información y se puede encontrar toda la información sobre la clave principal y clave externa en esta tabla

SELECT * FROM information_schema.TABLE_CONSTRAINTS T;

se debe ser un usuario ROOT para acceder al information_schema.

UTILIZANDO esta tabla puede encontrar la tabla, db y si tiene una clave externa.

Espero que esto ayude si no quiere utilizar IF EXIST y procedimiento almacenado. Pero estoy seguro de que puede usar IF EXIST puede usarse para consultas de procedimientos no almacenados ....

+0

"[S] necesita ser un usuario ROOT para acceder al esquema de información." ¿Dónde encontraste esta información? – rstackhouse

+0

Creo que es más exacto decir que un usuario solo puede ver la parte del esquema de información que tiene permisos. Si se crea un usuario con 'GRANT ALL', entonces pueden ver los permisos en esa tabla. – rstackhouse

1

¿Por qué no utiliza la tabla "INFORMATION_SCHEMA" para esto?

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

es necesario conectar al sistema de información y se puede encontrar toda la información sobre la clave principal y clave externa en esta tabla

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; 

AYUDA: véase este enlace list-foreign-keys-in-mysql

Cuestiones relacionadas