【问题标题】:Mysql/Maria unique keys representationMysql/Maria 唯一键表示
【发布时间】:2014-08-26 22:50:00
【问题描述】:

我想知道密钥是如何存储在 mysql/mariadb 数据库中的。 据我所知,information_schema.columns 中存储了一些类型:PRIMULUNI,分别表示主键、键和唯一键.

但事实并非如此。

MariaDB [test]> CREATE TABLE test_table(leftkey int unsigned, rightkey int unsigned, unique key(leftkey, rightkey));

MariaDB [test]> DESC test_table;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| leftkey  | int(10) unsigned | YES  | MUL | NULL    |       |
| rightkey | int(10) unsigned | YES  |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+

所以我有两个问题:

1) 我如何检测密钥类型是唯一的? describe 命令显示类型是 MUL,而不是 UNI(这意味着简单的键)。

2) 密钥对(例如:左键和右键)存储在哪里?

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    不要打扰 DESCRIBE,因为正如您所发现的,它在某些情况下会提供模棱两可的信息。

    只需使用SHOW CREATE TABLE。这将准确显示重新创建表的 SQL 语法。然后你就可以确切地知道存在哪些键,以及什么类型。

    mysql> show create table test_table\G
    *************************** 1. row ***************************
           Table: test_table
    Create Table: CREATE TABLE `test_table` (
      `leftkey` int(10) unsigned DEFAULT NULL,
      `rightkey` int(10) unsigned DEFAULT NULL,
      UNIQUE KEY `leftkey` (`leftkey`,`rightkey`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    

    您也可以查询INFORMATION_SCHEMA.STATISTICS获取更精准的信息。

    mysql> select * from information_schema.statistics where table_name='test_table'\G
    *************************** 1. row ***************************
    TABLE_CATALOG: def
     TABLE_SCHEMA: test
       TABLE_NAME: test_table
       NON_UNIQUE: 0
     INDEX_SCHEMA: test
       INDEX_NAME: leftkey
     SEQ_IN_INDEX: 1
      COLUMN_NAME: leftkey
        COLLATION: A
      CARDINALITY: 0
         SUB_PART: NULL
           PACKED: NULL
         NULLABLE: YES
       INDEX_TYPE: BTREE
          COMMENT: 
    INDEX_COMMENT: 
    *************************** 2. row ***************************
    TABLE_CATALOG: def
     TABLE_SCHEMA: test
       TABLE_NAME: test_table
       NON_UNIQUE: 0
     INDEX_SCHEMA: test
       INDEX_NAME: leftkey
     SEQ_IN_INDEX: 2
      COLUMN_NAME: rightkey
        COLLATION: A
      CARDINALITY: 0
         SUB_PART: NULL
           PACKED: NULL
         NULLABLE: YES
       INDEX_TYPE: BTREE
          COMMENT: 
    INDEX_COMMENT: 
    

    或者INFORMATION_SCHEMA.KEY_COLUMN_USAGE 表的信息略有不同:

    mysql> select * from information_schema.key_column_usage where table_name = 'test_table'\G
    *************************** 1. row ***************************
               CONSTRAINT_CATALOG: def
                CONSTRAINT_SCHEMA: test
                  CONSTRAINT_NAME: leftkey
                    TABLE_CATALOG: def
                     TABLE_SCHEMA: test
                       TABLE_NAME: test_table
                      COLUMN_NAME: leftkey
                 ORDINAL_POSITION: 1
    POSITION_IN_UNIQUE_CONSTRAINT: NULL
          REFERENCED_TABLE_SCHEMA: NULL
            REFERENCED_TABLE_NAME: NULL
           REFERENCED_COLUMN_NAME: NULL
    *************************** 2. row ***************************
               CONSTRAINT_CATALOG: def
                CONSTRAINT_SCHEMA: test
                  CONSTRAINT_NAME: leftkey
                    TABLE_CATALOG: def
                     TABLE_SCHEMA: test
                       TABLE_NAME: test_table
                      COLUMN_NAME: rightkey
                 ORDINAL_POSITION: 2
    POSITION_IN_UNIQUE_CONSTRAINT: NULL
          REFERENCED_TABLE_SCHEMA: NULL
            REFERENCED_TABLE_NAME: NULL
           REFERENCED_COLUMN_NAME: NULL
    

    【讨论】:

      【解决方案2】:

      information_schema.columns 描述的列不是作为约束的键。列用于约束,因此您需要使用其他一些information_schema 表来获取信息。

      您可以使用以下查询来获取有关约束的更多信息:

      SELECT *
      FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
      INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE TK
       ON TC.CONSTRAINT_SCHEMA = TK.CONSTRAINT_SCHEMA
       AND TC.TABLE_SCHEMA = TK.TABLE_SCHEMA
       AND TC.TABLE_NAME   = TK.TABLE_NAME
       AND TC.CONSTRAINT_NAME = TK.CONSTRAINT_NAME
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 2012-08-20
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-12
        相关资源
        最近更新 更多