How do I see all foreign keys to a table or column?
Uncovering Foreign Keys in MySQL: A Comprehensive Guide

Learn how to identify all foreign keys referencing a specific table or column in MySQL (InnoDB), using SQL queries and schema introspection.
Understanding the relationships between tables in a relational database is crucial for data integrity, querying, and schema evolution. Foreign keys are the backbone of these relationships, enforcing referential integrity by linking rows in one table to rows in another. This article will guide you through various methods to discover all foreign keys that reference a particular table or even a specific column within that table in MySQL, focusing on the InnoDB storage engine.
Why Find Foreign Keys?
Before diving into the 'how,' let's briefly consider the 'why.' Knowing which foreign keys point to a table or column is essential for several database operations:
- Schema Changes: When you need to modify or drop a primary key column, you must first address all dependent foreign keys.
- Data Deletion/Updates: Understanding cascade rules (ON DELETE, ON UPDATE) is vital to predict the impact of data manipulation on related tables.
- Performance Tuning: Identifying relationships helps in optimizing joins and understanding query execution plans.
- Database Documentation: For new team members or auditing, a clear picture of table dependencies is invaluable.
- Troubleshooting: Referential integrity errors often point back to issues with foreign key constraints.
Method 1: Querying INFORMATION_SCHEMA (MySQL 5.x+)
The INFORMATION_SCHEMA
database is a standard way to access metadata about your MySQL server. It contains several tables that store details about your database objects, including foreign key constraints. The REFERENTIAL_CONSTRAINTS
and KEY_COLUMN_USAGE
tables are particularly useful for this task.
SELECT
rc.CONSTRAINT_NAME,
rc.UPDATE_RULE,
rc.DELETE_RULE,
rc.TABLE_NAME AS referencing_table,
kcu.COLUMN_NAME AS referencing_column,
kcu.REFERENCED_TABLE_NAME AS referenced_table,
kcu.REFERENCED_COLUMN_NAME AS referenced_column
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS rc
JOIN
INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu
ON rc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
AND rc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
WHERE
rc.REFERENCED_TABLE_NAME = 'your_table_name' -- Replace with your table name
AND rc.CONSTRAINT_SCHEMA = 'your_database_name'; -- Replace with your database name
SQL query to find all foreign keys referencing a specific table.
To narrow down the results to a specific column within the referenced table, you can add an additional condition to the WHERE
clause:
SELECT
rc.CONSTRAINT_NAME,
rc.UPDATE_RULE,
rc.DELETE_RULE,
rc.TABLE_NAME AS referencing_table,
kcu.COLUMN_NAME AS referencing_column,
kcu.REFERENCED_TABLE_NAME AS referenced_table,
kcu.REFERENCED_COLUMN_NAME AS referenced_column
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS rc
JOIN
INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu
ON rc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
AND rc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
WHERE
rc.REFERENCED_TABLE_NAME = 'your_table_name'
AND kcu.REFERENCED_COLUMN_NAME = 'your_column_name' -- Replace with your column name
AND rc.CONSTRAINT_SCHEMA = 'your_database_name';
SQL query to find foreign keys referencing a specific column.
'your_table_name'
, 'your_column_name'
, and 'your_database_name'
with your actual database, table, and column names. Case sensitivity might apply depending on your MySQL server's configuration.Method 2: Using SHOW CREATE TABLE
While not as programmatic as querying INFORMATION_SCHEMA
, the SHOW CREATE TABLE
statement is a quick and easy way to inspect the DDL (Data Definition Language) for a specific table. The output will include all foreign key definitions for that table, both those it owns and those it references.
SHOW CREATE TABLE `your_table_name`;
Using SHOW CREATE TABLE to inspect table DDL.
This command will return a result set with two columns: Table
and Create Table
. The Create Table
column will contain the full CREATE TABLE
statement, including any FOREIGN KEY
clauses. You would then manually parse this output to find the relevant foreign key definitions. This method is more useful for finding foreign keys defined within a table, rather than those referencing it from other tables.
Visualizing Foreign Key Relationships
Understanding the relationships visually can be incredibly helpful. Here's a simple Entity-Relationship (ER) diagram illustrating how foreign keys connect tables.
erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--o{ ORDER_ITEM : contains PRODUCT ||--o{ ORDER_ITEM : includes CUSTOMER {string customer_id PK} ORDER {string order_id PK, string customer_id FK} ORDER_ITEM {string order_item_id PK, string order_id FK, string product_id FK} PRODUCT {string product_id PK}
Example ER Diagram showing foreign key relationships.
PK
denotes a Primary Key and FK
denotes a Foreign Key. The lines with o{
indicate a one-to-many relationship, where the 'o' side is optional and the '{' side is mandatory.Considerations for InnoDB
MySQL's InnoDB storage engine is the only one that fully supports foreign key constraints. If you are working with MyISAM tables, you will not find foreign key definitions in INFORMATION_SCHEMA
or SHOW CREATE TABLE
because MyISAM does not enforce referential integrity at the database level. In such cases, relationships are typically managed at the application level.
SHOW TABLE STATUS LIKE 'your_table_name';
and looking at the Engine
column.