显示表命令的约束

Cap*_*rap 207 mysql foreign-keys

我有桌子,我已经尝试设置PK FK关系,但我想验证这一点.如何显示PK/FK限制?我看到了这个手册页,但它没有显示示例,我的谷歌搜索也没有结果.我的数据库是credentialing1和我的约束表是practicescred_insurances.

Adr*_*ith 392

我用

SHOW CREATE TABLE mytable;
Run Code Online (Sandbox Code Playgroud)

这将显示以mytable当前形式重新标记所需的SQL语句.您可以查看所有列及其类型(如DESC),但它还会显示约束信息(以及表类型,字符集等).

  • 我不认为它显示了传入的fk关系?例如,`a.col_one引用b.col_one`并且在`show create table b`中将不包含有关上述关系的细节. (7认同)
  • 我确认此命令不显示外键约束。 (3认同)
  • 请注意,从10.2开始的MariaDB将在此返回尴尬的结果.https://jira.mariadb.org/browse/MDEV-15377 (2认同)
  • 这应该是公认的答案!它很简单,并且提供了惊人且详细的输出!我使用 mysql **Ver 8.0.23 for Win64** 并获得 FK 信息: ```CONSTRAINT `t_venues_ibfk_3` FOREIGN KEY (`f_products_id`) REFERENCES `t_products` (`m_id`) ON DELETE CASCADE, CONSTRAINT `t_venues_ibfk_4`删除级联时外键 (`f_field_id`) 引用 `t_fields` (`m_id`)`` (2认同)

Res*_*h32 109

只需查询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;
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,因为它以您可以以编程方式使用的格式提供结果.当然,您需要添加一个WHERE子句来缩小结果范围 (13认同)
  • 上述唯一的缺点是,key_column_usage 将仅显示正在使用的键。因此,对于空表,您将不会得到任何结果。 (3认同)

nfr*_*ure 17

验证答案的主要问题是您必须解析输出以获取信息.这是一个允许您以更有用的方式获取它们的查询:

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"
Run Code Online (Sandbox Code Playgroud)


ple*_*ock 10

afaik向您提出要求information_schema需要特权.如果需要简单的键列表,可以使用以下命令:

SHOW INDEXES IN <tablename>
Run Code Online (Sandbox Code Playgroud)

  • 警告:这显示索引,而不是约束! (2认同)

cod*_*ict 6

尝试做:

SHOW TABLE STATUS FROM credentialing1;
Run Code Online (Sandbox Code Playgroud)

外键约束列在输出的" 注释"列中.

  • 我在Comment列中只看到表注释.这可能与InnoDB类型有关. (3认同)
  • 评论仅用于用户评论。那肯定不是存储 FK 定义的地方!如果它们是为您准备的 - 它一定是由某个 RDBMS 工具代表您完成的。 (2认同)

Abh*_*pta 6

你可以用这个:

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'
Run Code Online (Sandbox Code Playgroud)

或者为了更好的格式化输出使用此:

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'
Run Code Online (Sandbox Code Playgroud)

  • @noboundaries你在Oracle上尝试这个,问题是关于MySQL (2认同)