How do I check if an index exists on a table field in MySQL?

前端 未结 10 1267
孤独总比滥情好
孤独总比滥情好 2020-12-12 16:55

I\'ve needed to Google this a couple times, so I\'m sharing my Q/A.

相关标签:
10条回答
  • 2020-12-12 17:15

    to just look at a tables layout from the cli. you would do

    desc mytable

    or

    show table mytable

    0 讨论(0)
  • 2020-12-12 17:17

    Use the following statement: SHOW INDEX FROM your_table

    And then check the result for the fields: row["Table"], row["Key_name"]

    Make sure you write "Key_name" correctly

    0 讨论(0)
  • 2020-12-12 17:18
    show index from table_name where Column_name='column_name';
    
    0 讨论(0)
  • 2020-12-12 17:19

    If you need the functionality if a index for a column exists (here at first place in sequence) as a database function you can use/adopt this code. If you want to check if an index exists at all regardless of the position in a multi-column-index, then just delete the part "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 ;
    
    0 讨论(0)
  • 2020-12-12 17:25

    Try use this:

    SELECT TRUE
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
    WHERE TABLE_SCHEMA = "{DB_NAME}" 
    AND TABLE_NAME = "{DB_TABLE}"
    AND COLUMN_NAME = "{DB_INDEXED_FIELD}";
    
    0 讨论(0)
  • 2020-12-12 17:28

    you can use the following SQL statement to check the given column on table was indexed or not

    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;
    

    since the joins are against INNODB_SYS_*, so the match indexes only came from INNODB tables only

    0 讨论(0)
提交回复
热议问题