En MySQL, ¿cómo obtengo una lista de todas las restricciones de clave externa que apuntan a una tabla en particular? una columna en particular? Esto es lo mismo que esta pregunta de Oracle , pero para MySQL.
En MySQL, ¿cómo obtengo una lista de todas las restricciones de clave externa que apuntan a una tabla en particular? una columna en particular? Esto es lo mismo que esta pregunta de Oracle , pero para MySQL.
Respuestas:
Para una mesa:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>';
Para una columna:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>' AND
REFERENCED_COLUMN_NAME = '<column>';
Básicamente, cambiamos REFERENCED_TABLE_NAME con REFERENCED_COLUMN_NAME en la cláusula where.
where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
EDITAR: Como se señaló en los comentarios, esta no es la respuesta correcta a la pregunta de los OP, pero es útil conocer este comando. Esta pregunta apareció en Google para lo que estaba buscando, y pensé que dejaría esta respuesta para que los demás la encuentren.
SHOW CREATE TABLE `<yourtable>`;
Encontré esta respuesta aquí: MySQL: mostrar restricciones en el comando de tablas
Necesitaba de esta manera porque quería ver cómo funcionaba el FK, en lugar de solo ver si existía o no.
<yourtable>
, no todas las restricciones que apuntan <yourtable>
.
display foreign keys mysql
en google, puede ser por eso;)
Si utiliza InnoDB y FK definidos, puede consultar la base de datos information_schema, por ejemplo:
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';
Publicar en una respuesta anterior para agregar información útil.
Tuve un problema similar, pero también quería ver CONSTRAINT_TYPE junto con la tabla REFERENCIADA y los nombres de columna. Entonces,
Para ver todos los FK en su tabla:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE()
AND i.TABLE_NAME = '<yourtable>';
Para ver todas las tablas y FK en su esquema:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE();
Para ver todos los FK en su base de datos:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';
¡Recuerda!
Esto está utilizando el motor de almacenamiento InnoDB. Si parece que no puede mostrar ninguna clave foránea después de agregarla, probablemente sea porque sus tablas están usando MyISAM.
Verificar:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Para solucionarlo, use esto:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Como alternativa a la respuesta de Node, si usa InnoDB y define FK, puede consultar la base de datos information_schema, por ejemplo:
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'
para claves foráneas de <table>, o
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'
para claves foráneas para <table>
También puede obtener UPDATE_RULE y DELETE_RULE si lo desea.
Esta solución no solo mostrará todas las relaciones, sino también el nombre de restricción, que se requiere en algunos casos (p. Ej., Caída de contraint):
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null;
Si desea verificar las tablas en una base de datos específica, al final de la consulta agregue el nombre del esquema:
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null
and table_schema = 'database_name';
Del mismo modo, para un nombre de columna específico, agregue
y table_name = 'table_name
al final de la consulta.
Inspirado en esta publicación aquí
Una forma rápida de enumerar sus FK (referencias de clave externa) utilizando el
KEY_COLUMN_USAGE view:
SELECT CONCAT( table_name, '.',
column_name, ' -> ',
referenced_table_name, '.',
referenced_column_name ) AS list_of_fks
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;
Esta consulta asume que las restricciones y todas las tablas referenciadas y de referencia están en el mismo esquema.
Agrega tu propio comentario.
Fuente: el manual oficial de mysql.
La solución que se me ocurrió es frágil; se basa en la convención de nomenclatura de django para claves externas.
USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee
Entonces, en el caparazón,
grep 'refs_tablename_id' mysql_output
Para buscar todas las tablas que contienen una clave foránea particular , comoemployee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
Si también desea obtener el nombre de la columna de clave externa:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME,
i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME,
k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k
ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY i.TABLE_NAME;