代码之家  ›  专栏  ›  技术社区  ›  Sean

如何检查MySQL中的表字段上是否存在索引?

  •  91
  • Sean  · 技术社区  · 16 年前

    9 回复  |  直到 9 年前
        1
  •  151
  •   mlissner    10 年前

    使用 SHOW INDEX 像这样:

    SHOW INDEX FROM [tablename]
    

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

        2
  •  37
  •   Udo Held    13 年前

    尝试:

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

        3
  •  9
  •   andrewsi Laxman Battini    12 年前
    SHOW KEYS FROM  tablename WHERE Key_name='unique key name'
    

    您可以找到表中是否存在唯一的键

        4
  •  9
  •   chris85 Ferenc Kurucz    9 年前
    show index from table_name where Column_name='column_name';
    
        5
  •  6
  •   GK10    7 年前

    使用以下语句:SHOW INDEX FROM 你的桌子

    确保您正确填写了“密钥名称”

        6
  •  1
  •   J.J.    16 年前

    仅从cli查看表布局。你会的

    描述我的表格

        7
  •  1
  •   napierjohn    4 年前

    使用以下语句:从您的_表中显示索引

    然后检查字段的结果:行[“表”],

    确保您正确填写了“密钥名称”

    您可以将其转换为PHP(或其他语言),并围绕sql语句查找索引列。基本上,您可以将SHOW INDEX的结果从“mytable”拉入PHP,然后使用列“column\u 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"];
    }
    
        8
  •  0
  •   Dian Yudha Negara    7 年前

    您可以使用下面的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表

        9
  •  0
  •   Hubbe73    6 年前

    如果您需要一个列的索引作为数据库函数存在的功能(这里是按顺序排列的第一位),您可以使用/采用此代码。 如果您想检查索引是否存在,而不管它在多列索引中的位置如何,那么只需删除部分“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 ;
    
        10
  •  0
  •   De Paradox    4 年前

    尝试使用以下方法:

    SELECT TRUE
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
    WHERE TABLE_SCHEMA = "{DB_NAME}" 
    AND TABLE_NAME = "{DB_TABLE}"
    AND COLUMN_NAME = "{DB_INDEXED_FIELD}";
    
        11
  •  -3
  •   kjdion84    8 年前

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

    我是这样做的。我从表中获取所有索引(在本例中, leads 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 看看你能用什么。