Bagaimana cara memeriksa apakah indeks ada di bidang tabel di MySQL?


105

Saya perlu Google ini beberapa kali, jadi saya membagikan Q / A saya.

Jawaban:


139

Gunakan SHOW INDEXseperti ini:

SHOW INDEX FROM [tablename]

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


35
TAMPILKAN INDEKS DARI my_tableMANA Key_name = 'index_to_check';
mit

6
Lebih baik gunakan Column_name daripada Key_name, dengan cara ini Anda tidak perlu mencari tahu nama indeks jika ditambahkan secara otomatis tanpa nama.
Programista

Bagaimana cara memeriksa beberapa kunci?
mengamuk

Hati-hati dan uji semua pernyataan menggunakan ini. Ini gagal pada beberapa tabel di database saya saat mencoba menggunakannya dengan LiquiBase 1.9.5. Mungkin DB saya rusak. Atau mungkin itu bug di versi kuno LiquiBase yang tidak bisa saya gunakan di tempat kerja.
Steve Gelman

36

Mencoba:

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

Ini akan memberi tahu Anda jika ada indeks dalam bentuk apa pun pada kolom tertentu tanpa perlu mengetahui nama yang diberikan ke indeks. Ini juga akan bekerja dalam prosedur yang tersimpan (sebagai lawan untuk menampilkan indeks)


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

Anda dapat menemukan jika ada kunci unik di tabel


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

4

Gunakan pernyataan berikut: TAMPILKAN INDEKS DARI tabel_Anda

Dan kemudian periksa hasil untuk bidang: baris ["Tabel"], baris ["Nama_kunci"]

Pastikan Anda menulis "Key_name" dengan benar


1

untuk hanya melihat tata letak tabel dari cli. kamu akan melakukannya

desc mytable

atau

tunjukkan tabel mytable


0

Jika Anda memerlukan fungsionalitas jika indeks untuk kolom ada (di sini di urutan pertama) sebagai fungsi database Anda dapat menggunakan / mengadopsi kode ini. Jika Anda ingin memeriksa apakah ada indeks sama sekali terlepas dari posisinya dalam indeks multi-kolom, maka hapus saja bagian "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

Anda dapat menggunakan pernyataan SQL berikut untuk memeriksa kolom yang diberikan pada tabel diindeks atau tidak

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;

karena gabungan melawan INNODB_SYS_ *, jadi indeks kecocokan hanya berasal dari tabel INNODB saja


-1

Coba gunakan ini:

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

Anda tidak dapat menjalankan kueri indeks acara tertentu karena akan memunculkan kesalahan jika indeks tidak ada. Oleh karena itu, Anda harus mengambil semua indeks ke dalam array dan mengulanginya jika Anda ingin menghindari kesalahan SQL.

Inilah cara saya melakukannya. Saya mengambil semua indeks dari tabel (dalam kasus ini, leads) dan kemudian, dalam loop foreach, periksa apakah nama kolom (dalam kasus ini, province) ada atau tidak.

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

Dengan cara ini Anda benar-benar dapat mempersempit atribut indeks. Lakukan print_rdari $resdalam rangka untuk melihat apa yang dapat Anda bekerja dengan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.