【问题标题】:MySQL: how can I see ALL constraints on a table?MySQL:如何查看表上的所有约束?
【发布时间】:2011-02-23 18:02:00
【问题描述】:

我正在学习 SQL,但困扰我的是,我似乎无法在表上找到所有约束。我用

创建了表格
create table t2
(a integer not null primary key,
b integer not null, constraint c1 check(b>0),
constraint fk1 foreign key(a) references t1(a));

并添加了一个约束

alter table t2
add constraint c2 check (b<20);

然后我尝试查看所有(四个)约束

show table status
from tenn #-->the name of my database
like 't2';

然后

show create table t2;

然后

select *
from information_schema.key_column_usage
where table_name='t2';

最后

select *
from information_schema.table_constraints
where table_name='t2';

但这些都没有显示所有四个约束。谁能告诉我如何查看所有这些?

非常感谢!

【问题讨论】:

  • 您能否指定您运行的查询的结果是什么? * P.S 听说mysql不支持检查约束。
  • 虽然你尝试过 CONSTRAINT_COLUMN_USAGE?
  • 您可以尝试直接查询系统表,而不是Information Schema视图

标签: mysql


【解决方案1】:
select COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_COLUMN_NAME, REFERENCED_TABLE_NAME
from information_schema.KEY_COLUMN_USAGE
where TABLE_NAME = 'table to be checked';

【讨论】:

  • 截至 2020 年 3 月,此查询未显示该表可能具有的任何 CHECK 约束。
【解决方案2】:

查看当前表及其约束的解释的最简单方法是使用:

SHOW CREATE TABLE mytable;

这将准确地显示将输入什么 SQL 来定义当前形式的表结构。

【讨论】:

    【解决方案3】:

    你可以用这个:

    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'
    

    【讨论】:

    • 是否也可以在表中显示所有数据库名称?
    • 是的,还有项目table_schema
    【解决方案4】:

    您可以像这样从information_schema.table_constraints 获得它:

    SELECT * 
    FROM   information_schema.table_constraints
    WHERE  table_schema = schema()
    AND    table_name = 'table_name';
    

    【讨论】:

      【解决方案5】:

      外键约束列在以下命令输出的注释列中:

       SHOW TABLE STATUS FROM db_name LIKE 'tbl_name';
      

      【讨论】:

      • 这对我不起作用(mysql 5.5.35-0ubuntu0.12.04.2):cmets 字段为空白,而 R R Madhav 的解决方案显示约束作为列返回。
      【解决方案6】:

      不幸的是 MySQL 不支持 SQL 检查约束。当您在查询中定义它们时,它们会被忽略。

      【讨论】:

      • 您可能想删除您的答案,因为现在支持 CHECK 约束。
      • * 自 MySql 8 起
      【解决方案7】:

      以 SQL 导出数据库表。

      如果您有 phpmyadmin,您可以通过访问“导出”选项卡来执行此操作。如果您选择“自定义”导出方法,请务必在“格式特定选项”部分下选择“结构”或“结构和数据”。

      示例 .sql 导出 sn-p:

      --
      -- Table structure for table `customers`
      --    
      
      CREATE TABLE `customers` (
        `username` varchar(50) NOT NULL,
        `fullname` varchar(100) NOT NULL,
        `postalcode` varchar(50) NOT NULL,
        PRIMARY KEY (`username`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      ...
      

      【讨论】:

        猜你喜欢
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        相关资源
        最近更新 更多