I have tables that I've tried setting PK FK relationships on but I want to verify this. How can I show the PK/FK restraints? I saw this manual page, but it does not show examples and my google search was fruitless also. My database is credentialing1
and my constrained tables are practices
and cred_insurances
.

- 27
- 1
- 6

- 3,839
- 5
- 25
- 29
8 Answers
I use
SHOW CREATE TABLE mytable;
This shows you the SQL statement necessary to receate mytable
in its current form. You can see all the columns and their types (like DESC
) but it also shows you constraint information (and table type, charset, etc.).

- 17,236
- 11
- 71
- 93
-
10i don't think it shows the incoming fk relations? as in for example, `a.col_one references b.col_one` and in `show create table b` will not contain detail about the aforementioned relation. – Vineet Menon Oct 10 '14 at 09:44
-
4I confirmed that this command does not display the foreign key constraint. – Kemin Zhou Jun 06 '16 at 22:34
-
2Beware that MariaDB starting with 10.2 will return awkward results here. https://jira.mariadb.org/browse/MDEV-15377 – stamster Feb 24 '18 at 18:14
-
I believe this wont show constrains further than PK – alilloig Feb 11 '21 at 08:56
-
2This should be the accepted answer!!! It's simple and gives an amazing and detailed output!!! I use mysql **Ver 8.0.23 for Win64** and I get FK information: ```CONSTRAINT `t_incomes_ibfk_3` FOREIGN KEY (`f_production_id`) REFERENCES `t_productions` (`m_id`) ON DELETE CASCADE, CONSTRAINT `t_incomes_ibfk_4` FOREIGN KEY (`f_field_id`) REFERENCES `t_fields` (`m_id`) ON DELETE CASCADE``` – babaliaris Apr 26 '21 at 12:01
Simply query the INFORMATION_SCHEMA:
USE INFORMATION_SCHEMA;
SELECT TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "<your_database_name>"
AND TABLE_NAME = "<your_table_name>"
AND REFERENCED_COLUMN_NAME IS NOT NULL;

- 31,877
- 16
- 137
- 115

- 6,500
- 3
- 32
- 40
-
18This is the best answer because it gives you the result in a format that you can use programmatically. Of course you will need to add a WHERE clause to narrow down the results – Naveed Hasan Jan 27 '14 at 10:30
-
This helped me find a corrupt table that had the column 'id' referencing several foreign keys. No wonder the table got 1452 IntegrityError. – Vicky T Sep 05 '15 at 16:03
-
I love that you prefixed your answer with "Simply." Great answer, though! – leviathanbadger Oct 23 '17 at 23:16
-
That will not display actual constraint rules - e.g. `ON UPDATE CASCADE` – stamster Feb 24 '18 at 18:39
-
3The only disadvantage of the above is, key_column_usage will only show keys that are in use. So for empty tables you won't get any results. – Gerbrand Aug 19 '20 at 12:56
The main problem with the validated answer is you'll have to parse the output to get the informations. Here is a query allowing you to get them in a more usable manner :
SELECT cols.TABLE_NAME, cols.COLUMN_NAME, cols.ORDINAL_POSITION,
cols.COLUMN_DEFAULT, cols.IS_NULLABLE, cols.DATA_TYPE,
cols.CHARACTER_MAXIMUM_LENGTH, cols.CHARACTER_OCTET_LENGTH,
cols.NUMERIC_PRECISION, cols.NUMERIC_SCALE,
cols.COLUMN_TYPE, cols.COLUMN_KEY, cols.EXTRA,
cols.COLUMN_COMMENT, refs.REFERENCED_TABLE_NAME, refs.REFERENCED_COLUMN_NAME,
cRefs.UPDATE_RULE, cRefs.DELETE_RULE,
links.TABLE_NAME, links.COLUMN_NAME,
cLinks.UPDATE_RULE, cLinks.DELETE_RULE
FROM INFORMATION_SCHEMA.`COLUMNS` as cols
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS refs
ON refs.TABLE_SCHEMA=cols.TABLE_SCHEMA
AND refs.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA
AND refs.TABLE_NAME=cols.TABLE_NAME
AND refs.COLUMN_NAME=cols.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cRefs
ON cRefs.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA
AND cRefs.CONSTRAINT_NAME=refs.CONSTRAINT_NAME
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS links
ON links.TABLE_SCHEMA=cols.TABLE_SCHEMA
AND links.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA
AND links.REFERENCED_TABLE_NAME=cols.TABLE_NAME
AND links.REFERENCED_COLUMN_NAME=cols.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cLinks
ON cLinks.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA
AND cLinks.CONSTRAINT_NAME=links.CONSTRAINT_NAME
WHERE cols.TABLE_SCHEMA=DATABASE()
AND cols.TABLE_NAME="table"
afaik to make a request to information_schema
you need privileges. If you need simple list of keys you can use this command:
SHOW INDEXES IN <tablename>

- 18,322
- 16
- 103
- 128
-
How is calling information_schema is better than this, thanks alot – Eiad Samman Feb 21 '17 at 04:59
You can use this:
select
table_name,column_name,referenced_table_name,referenced_column_name
from
information_schema.key_column_usage
where
referenced_table_name is not null
and table_schema = 'my_database'
and table_name = 'my_table'
Or for better formatted output use this:
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
and table_schema = 'my_database'
and table_name = 'my_table'

- 6,465
- 10
- 50
- 82
-
ORA-00942: table or view does not exist 00942. 00000 - "table or view does not exist" *Cause: *Action: Error at Line: 29 Column: 5 Line 29 is "information_schema.key_column_usage" – Jeyan Aug 28 '13 at 10:37
-
3@noboundaries you're trying that on Oracle, the question is about MySQL – ymajoros Sep 12 '14 at 05:05
Try doing:
SHOW TABLE STATUS FROM credentialing1;
The foreign key constraints are listed in the Comment column of the output.

- 445,704
- 82
- 492
- 529
-
3I see only table comments in the Comment column. It is probably something to do with InnoDB types. – clockworkgeek Dec 30 '12 at 13:48
-
3Comments are only for user comments. That's for sure not the place where FK definitions are stored! If they're for you - it must have been done on your behalf by some RDBMS tool. – stamster Feb 24 '18 at 18:13
There is also a tool that oracle made called mysqlshow
If you run it with the --k keys $table_name
option it will display the keys.
SYNOPSIS
mysqlshow [options] [db_name [tbl_name [col_name]]]
.......
.......
.......
· --keys, -k
Show table indexes.
example:
╰─➤ mysqlshow -h 127.0.0.1 -u root -p --keys database tokens
Database: database Table: tokens
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id | int(10) unsigned | | NO | PRI | | auto_increment | select,insert,update,references | |
| token | text | utf8mb4_unicode_ci | NO | | | | select,insert,update,references | |
| user_id | int(10) unsigned | | NO | MUL | | | select,insert,update,references | |
| expires_in | datetime | | YES | | | | select,insert,update,references | |
| created_at | timestamp | | YES | | | | select,insert,update,references | |
| updated_at | timestamp | | YES | | | | select,insert,update,references | |
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tokens | 0 | PRIMARY | 1 | id | A | 2 | | | | BTREE | | |
| tokens | 1 | tokens_user_id_foreign | 1 | user_id | A | 2 | | | | BTREE | | |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

- 5,979
- 2
- 14
- 23
Analogous to @Resh32, but without the need to use the USE
statement:
SELECT TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "database_name"
AND TABLE_NAME = "table_name"
AND REFERENCED_COLUMN_NAME IS NOT NULL;
Useful, e.g. using the ORM.

- 31,877
- 16
- 137
- 115
-
That will not display actual constraint rules - e.g. `ON UPDATE CASCADE` – stamster Feb 24 '18 at 18:39