MySQL'de bir tablo alanında bir dizin olup olmadığını nasıl kontrol ederim?


105

Bunu birkaç kez Google'a ihtiyacım vardı, bu yüzden soru / cevaplarımı paylaşıyorum.

Yanıtlar:


139

Şöyle kullanın SHOW INDEX:

SHOW INDEX FROM [tablename]

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


35
DAN GÖSTER ENDEKSİ my_tableKEY_NAME = 'index_to_check';
mit

6
Anahtar_adı yerine Sütun_adı kullansanız daha iyi olur, bu şekilde otomatik olarak isimsiz eklenirse dizin adını bulmanız gerekmez.
Programista

Birden fazla anahtar nasıl kontrol edilir?
berserk

Dikkatli olun ve bunu kullanarak tüm ifadeleri test edin. Bu, LiquiBase 1.9.5 ile kullanmaya çalışırken veritabanımdaki bazı tablolarda başarısız oluyor. Belki de DB'm bozulmuştur. Ya da belki de işte takılıp kaldığım LiquiBase'in eski versiyonundaki bir hatadır.
Steve Gelman

37

Deneyin:

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

Dizine verilen adın bilinmesine gerek kalmadan, belirli bir sütunda herhangi bir türden dizin olup olmadığını size söyleyecektir. Ayrıca bir saklı yordamda da çalışacaktır (dizini göstermenin aksine)


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

Tabloda benzersiz bir anahtar olup olmadığını bulabilirsiniz


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

4

Aşağıdaki ifadeyi kullanın: Tezgahınızın_DENİNİ GÖSTERİN

Ve sonra şu alanlar için sonucu kontrol edin: satır ["Tablo"], satır ["Anahtar_adı"]

"Key_name" yi doğru yazdığınızdan emin olun


1

cli'dan bir tablo düzenine bakmak için. yapardın

desc mytable

veya

masamı göster


0

Bir sütun için bir dizin varsa (burada sırayla ilk sırada) bir veritabanı işlevi olarak işlevselliğe ihtiyacınız varsa, bu kodu kullanabilir / kabul edebilirsiniz. Çok sütunlu bir dizindeki konumdan bağımsız olarak bir dizinin var olup olmadığını kontrol etmek istiyorsanız, "AND SEQ_IN_INDEX = 1" bölümünü silin.

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

Tablodaki verilen sütunun indekslenip endekslenmediğini kontrol etmek için aşağıdaki SQL ifadesini kullanabilirsiniz

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;

birleştirmeler INNODB_SYS_ * 'ye karşı olduğundan, eşleşme dizinleri yalnızca INNODB tablolarından geldi


-1

Bunu kullanmayı deneyin:

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

Belirli bir gösteri dizini sorgusu çalıştıramazsınız çünkü bir dizin yoksa hata verir. Bu nedenle, herhangi bir SQL hatasından kaçınmak istiyorsanız, tüm dizinleri bir diziye almalı ve aralarında döngü yapmalısınız.

İşte nasıl yaparım. Tablodaki tüm indeksleri alıyorum (bu durumda, leads) ve sonra bir foreach döngüsünde sütun adının (bu durumda province) var olup olmadığını kontrol ediyorum .

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

Bu şekilde dizin özelliklerini gerçekten daraltabilirsiniz. Bir Do print_rait $resÇalışmak neler yapabileceğini görmek için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.