Làm cách nào để kiểm tra xem một chỉ mục có tồn tại trên một trường bảng trong MySQL hay không?


105

Tôi đã cần đến Google điều này một vài lần, vì vậy tôi đang chia sẻ Câu hỏi / Đáp của mình.

Câu trả lời:


139

Sử dụng SHOW INDEXnhư vậy:

SHOW INDEX FROM [tablename]

Tài liệu: https://dev.mysql.com/doc/refman/5.0/en/show-index.html


35
HIỂN THỊ CHỈ SỐ TỪ my_tableĐÂU Key_name = 'index_to_check';
mit

6
Tốt hơn nên sử dụng Column_name thay vì Key_name, bằng cách này bạn không cần phải tìm ra tên chỉ mục nếu nó được thêm tự động mà không có tên.
Programista

Làm thế nào để kiểm tra nhiều khóa?
berserk

Hãy cẩn thận và kiểm tra tất cả các tuyên bố bằng cách sử dụng này. Điều này không thành công trên một số bảng trong cơ sở dữ liệu của tôi khi cố gắng sử dụng nó với LiquiBase 1.9.5. Có thể DB của tôi bị hỏng. Hoặc có thể đó là một lỗi trong phiên bản LiquiBase cổ mà tôi đang sử dụng tại nơi làm việc.
Steve Gelman

37

Thử:

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

Nó sẽ cho bạn biết nếu có một chỉ mục thuộc bất kỳ loại nào trên một cột nhất định mà không cần biết tên được đặt cho chỉ mục. Nó cũng sẽ hoạt động trong một thủ tục được lưu trữ (trái ngược với hiển thị chỉ mục)


9
SHOW KEYS FROM  tablename WHERE Key_name='unique key name'

bạn có thể tìm nếu có một khóa duy nhất trong bảng


8
show index from table_name where Column_name='column_name';

4

Sử dụng câu lệnh sau: SHOW INDEX FROM your_table

Và sau đó kiểm tra kết quả cho các trường: row ["Table"], row ["Key_name"]

Đảm bảo bạn viết đúng "Key_name"


1

để chỉ xem bố cục bảng từ cli. bạn sẽ làm

desc mytable

hoặc là

hiển thị bảng mytable


0

Nếu bạn cần chức năng nếu chỉ mục cho một cột tồn tại (ở đây, ở vị trí đầu tiên theo trình tự) như một chức năng cơ sở dữ liệu, bạn có thể sử dụng / thông qua mã này. Nếu bạn muốn kiểm tra xem một chỉ mục có tồn tại bất kể vị trí trong chỉ mục nhiều cột hay không, thì chỉ cần xóa phần "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 ;

-1

bạn có thể sử dụng câu lệnh SQL sau để kiểm tra cột nhất định trên bảng đã được lập chỉ mục hay chưa

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;

vì các liên kết chống lại INNODB_SYS_ *, vì vậy chỉ mục đối sánh chỉ đến từ các bảng INNODB mà thôi


-1

Hãy thử sử dụng cái này:

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

Bạn không thể chạy một truy vấn chỉ mục chương trình cụ thể vì nó sẽ gây ra lỗi nếu chỉ mục không tồn tại. Do đó, bạn phải lấy tất cả các chỉ mục vào một mảng và lặp qua chúng nếu bạn muốn tránh bất kỳ lỗi SQL nào.

Đây là cách tôi làm điều đó. Tôi lấy tất cả các chỉ mục từ bảng (trong trường hợp này, leads) và sau đó, trong một vòng lặp foreach, hãy kiểm tra xem tên cột (trong trường hợp này, province) có tồn tại hay không.

$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;
    }
}

Bằng cách này, bạn thực sự có thể thu hẹp các thuộc tính chỉ mục. Thực hiện một print_rtrong số $resđể xem bạn có thể làm việc với những gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.