【问题标题】:How to check if an index exists on a table field in MySQL如何检查 MySQL 中表字段上是否存在索引?
【发布时间】:2010-09-12 17:35:03
【问题描述】:

我需要用 Google 搜索几次,所以我分享了我的 Q/A。

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    补充 GK10 的建议:

    使用以下语句:SHOW INDEX FROM your_table

    然后检查字段的结果:row["Table"], 行["Key_name"]

    确保您正确书写“Key_name”

    人们可以将其转化为 PHP(或其他语言),包裹在 sql 语句中以查找索引列。基本上你可以将 SHOW INDEX FROM 'mytable' 的结果拉入 PHP 中,然后使用列 'Column_name' 来获取索引列。

    制作您的数据库连接字符串并执行以下操作:

    $mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");
    
    $sql =  "SHOW INDEX FROM 'mydatabase.mytable' WHERE Key_name = 'PRIMARY';" ;
    $result = mysqli_query($mysqli, $sql);
    
    while ($row = $result->fetch_assoc()) {
        echo $rowVerbatimsSet["Column_name"];
    }
    

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT TRUE
      FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
      WHERE TABLE_SCHEMA = "{DB_NAME}" 
      AND TABLE_NAME = "{DB_TABLE}"
      AND COLUMN_NAME = "{DB_INDEXED_FIELD}";
      

      【讨论】:

        【解决方案3】:

        如果您需要该功能,如果列的索引存在(这里按顺序排列在第一位)作为数据库函数,您可以使用/采用此代码。 如果你想检查一个索引是否存在而不管在多列索引中的位置,那么只需删除“AND SEQ_IN_INDEX = 1”部分。

        DELIMITER $$
        CREATE FUNCTION `fct_check_if_index_for_column_exists_at_first_place`(
            `IN_SCHEMA` VARCHAR(255),
            `IN_TABLE` VARCHAR(255),
            `IN_COLUMN` VARCHAR(255)
        )
        RETURNS tinyint(4)
        LANGUAGE SQL
        DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT 'Check if index exists at first place in sequence for a given column in a given table in a given schema. Returns -1 if schema does not exist. Returns -2 if table does not exist. Returns -3 if column does not exist. If index exists in first place it returns 1, otherwise 0.'
        BEGIN
        
        -- Check if index exists at first place in sequence for a given column in a given table in a given schema. 
        -- Returns -1 if schema does not exist. 
        -- Returns -2 if table does not exist. 
        -- Returns -3 if column does not exist. 
        -- If the index exists in first place it returns 1, otherwise 0.
        -- Example call: SELECT fct_check_if_index_for_column_exists_at_first_place('schema_name', 'table_name', 'index_name');
        
        -- check if schema exists
        SELECT 
            COUNT(*) INTO @COUNT_EXISTS
        FROM 
            INFORMATION_SCHEMA.SCHEMATA
        WHERE 
            SCHEMA_NAME = IN_SCHEMA
        ;
        
        IF @COUNT_EXISTS = 0 THEN
            RETURN -1;
        END IF;
        
        
        -- check if table exists
        SELECT 
            COUNT(*) INTO @COUNT_EXISTS
        FROM 
            INFORMATION_SCHEMA.TABLES
        WHERE 
            TABLE_SCHEMA = IN_SCHEMA
        AND TABLE_NAME = IN_TABLE
        ;
        
        IF @COUNT_EXISTS = 0 THEN
            RETURN -2;
        END IF;
        
        
        -- check if column exists
        SELECT 
            COUNT(*) INTO @COUNT_EXISTS
        FROM 
            INFORMATION_SCHEMA.COLUMNS
        WHERE 
            TABLE_SCHEMA = IN_SCHEMA
        AND TABLE_NAME = IN_TABLE
        AND COLUMN_NAME = IN_COLUMN
        ;
        
        IF @COUNT_EXISTS = 0 THEN
            RETURN -3;
        END IF;
        
        -- check if index exists at first place in sequence
        SELECT 
            COUNT(*) INTO @COUNT_EXISTS
        FROM 
            information_schema.statistics 
        WHERE 
            TABLE_SCHEMA = IN_SCHEMA
        AND TABLE_NAME = IN_TABLE AND COLUMN_NAME = IN_COLUMN
        AND SEQ_IN_INDEX = 1;
        
        
        IF @COUNT_EXISTS > 0 THEN
            RETURN 1;
        ELSE
            RETURN 0;
        END IF;
        
        
        END$$
        DELIMITER ;
        

        【讨论】:

          【解决方案4】:

          使用以下语句:SHOW INDEX FROM your_table

          然后检查字段的结果:row["Table"], row["Key_name"]

          确保你正确地写“Key_name”

          【讨论】:

            【解决方案5】:

            您可以使用以下 SQL 语句检查表上的给定列是否被索引

            select  a.table_schema, a.table_name, a.column_name, index_name
            from    information_schema.columns a
            join    information_schema.tables  b on a.table_schema  = b.table_schema and
                                                a.table_name = b.table_name and 
                                                b.table_type = 'BASE TABLE'
            left join (
             select     concat(x.name, '/', y.name) full_path_schema, y.name index_name
             FROM   information_schema.INNODB_SYS_TABLES  as x
             JOIN   information_schema.INNODB_SYS_INDEXES as y on x.TABLE_ID = y.TABLE_ID
             WHERE  x.name = 'your_schema'
             and    y.name = 'your_column') d on concat(a.table_schema, '/', a.table_name, '/', a.column_name) = d.full_path_schema
            where   a.table_schema = 'your_schema'
            and     a.column_name  = 'your_column'
            order by a.table_schema, a.table_name;
            

            由于连接是针对 INNODB_SYS_*,所以匹配索引仅来自 INNODB 表

            【讨论】:

              【解决方案6】:

              您无法运行特定的显示索引查询,因为如果索引不存在,它将引发错误。因此,如果您想避免任何 SQL 错误,则必须将所有索引抓取到一个数组中并循环遍历它们。

              这就是我的做法。我从表中获取所有索引(在本例中为 leads),然后在 foreach 循环中检查列名(在本例中为 province)是否存在。

              $this->name = 'province';
              
              $stm = $this->db->prepare('show index from `leads`');
              $stm->execute();
              $res = $stm->fetchAll();
              $index_exists = false;
              
              foreach ($res as $r) {
                  if ($r['Column_name'] == $this->name) {
                      $index_exists = true;
                  }
              }
              

              这样你可以真正缩小索引属性的范围。执行 print_r$res 以查看您可以使用的内容。

              【讨论】:

                【解决方案7】:
                show index from table_name where Column_name='column_name';
                

                【讨论】:

                  【解决方案8】:

                  像这样使用SHOW INDEX

                  SHOW INDEX FROM [tablename]
                  

                  文档:https://dev.mysql.com/doc/refman/5.0/en/show-index.html

                  【讨论】:

                  • 显示来自 my_table 的索引 WHERE Key_name = 'index_to_check';
                  • 最好使用Column_name而不是Key_name,这样如果没有名称自动添加,则无需查找索引名称。
                  • 如何检查多个键?
                  • 小心并使用它测试所有语句。尝试将其与 LiquiBase 1.9.5 一起使用时,这在我的数据库中的某些表上失败。也许我的数据库已损坏。或者可能是我在工作中一直使用的旧版 LiquiBase 中的一个错误。
                  【解决方案9】:
                  SHOW KEYS FROM  tablename WHERE Key_name='unique key name'
                  

                  可以查找表中是否存在唯一键

                  【讨论】:

                    【解决方案10】:

                    试试:

                    SELECT * FROM information_schema.statistics 
                      WHERE table_schema = [DATABASE NAME] 
                        AND table_name = [TABLE NAME] AND column_name = [COLUMN NAME]
                    

                    它会告诉您是否在某个列上有任何类型的索引,而无需知道索引的名称。它也可以在存储过程中工作(而不是显示索引)

                    【讨论】:

                      【解决方案11】:

                      仅查看 cli 中的表格布局。你会做的

                      描述我的表

                      显示表mytable

                      【讨论】:

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