【问题标题】:Show constraints on tables command显示表命令的约束
【发布时间】:2011-04-29 14:04:13
【问题描述】:

我有一些表,我尝试在其上设置 PK FK 关系,但我想验证这一点。如何显示 PK/FK 约束?我看到了this 手册页,但它没有显示示例,我的谷歌搜索也没有结果。我的数据库是credentialing1,我的约束表是practicescred_insurances

【问题讨论】:

    标签: mysql foreign-keys


    【解决方案1】:

    尝试做:

    SHOW TABLE STATUS FROM credentialing1;
    

    外键约束列在输出的 Comment 列中。

    【讨论】:

    • 我在 Comment 列中只看到表 cmets。这可能与 InnoDB 类型有关。
    • 评论只针对用户cmets。那肯定不是存储 FK 定义的地方!如果它们是给你的 - 它一定是由一些 RDBMS 工具代表你完成的。
    【解决方案2】:

    我用

    SHOW CREATE TABLE mytable;
    

    这向您显示了以当前形式接收mytable 所需的 SQL 语句。您可以看到所有列及其类型(如 DESC),但它还显示约束信息(以及表类型、字符集等)。

    【讨论】:

    • 我不认为它显示了传入的 fk 关系?例如,a.col_one references b.col_oneshow create table b 将不包含有关上述关系的详细信息。
    • 我确认此命令不显示外键约束。
    • 请注意,从 10.2 开始的 MariaDB 会在这里返回尴尬的结果。 jira.mariadb.org/browse/MDEV-15377
    • 我相信这不会显示出比 PK 更进一步的约束
    • 这应该是公认的答案!!!它很简单,并且提供了惊人而详细的输出!!!我使用 mysql Ver 8.0.23 for Win64 并获得 FK 信息: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
    【解决方案3】:

    只需查询 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;
    

    【讨论】:

    • 这是最好的答案,因为它以您可以通过编程方式使用的格式为您提供结果。当然,您需要添加 WHERE 子句来缩小结果范围
    • 这帮助我找到了一个损坏的表,该表的“id”列引用了多个外键。难怪该表得到 1452 IntegrityError。
    • 我喜欢您在答案前加上“简单”。不过答案很好!
    • 这不会显示实际的约束规则 - 例如ON UPDATE CASCADE
    • 上述唯一的缺点是,key_column_usage 只会显示正在使用的键。因此,对于空表,您不会得到任何结果。
    【解决方案4】:

    你可以用这个:

    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'
    

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

    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'
    

    【讨论】:

    • ORA-00942:表或视图不存在 00942. 00000 - “表或视图不存在” *原因:*操作:第 29 行错误第 5 列第 29 行是“information_schema。 key_column_usage"
    • @noboundaries 你在 Oracle 上尝试,问题是关于 MySQL 的
    【解决方案5】:

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

    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"
    

    【讨论】:

      【解决方案6】:

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

      SHOW INDEXES IN <tablename>
      

      【讨论】:

      • 如何调用 information_schema 比这更好,非常感谢
      【解决方案7】:

      oracle还有一个工具叫mysqlshow

      如果您使用--k keys $table_name 选项运行它,它将显示密钥。

      SYNOPSIS
         mysqlshow [options] [db_name [tbl_name [col_name]]]
      .......
      .......
      .......
      ·   --keys, -k
         Show table indexes.
      

      示例:

      ╰─➤  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      |         |               |
      +--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
      

      【讨论】:

        【解决方案8】:

        类似于@Resh32,但不需要使用USE 语句:

        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;
        

        有用的,例如使用 ORM。

        【讨论】:

        • 这不会显示实际的约束规则 - 例如ON UPDATE CASCADE
        猜你喜欢
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多