"Varsa" nasıl istihdam edebilir

7 Cevap php

Bir dizin oluştururken veya MySQL üzerinde tahrip önce olup olmadığını denetlemek için bir yol olup olmadığını merak ediyordum. Orada bu bir özellik isteği birkaç yıl önce oldu, ama ben bir çözüm için herhangi bir belge bulamıyor görünür. Bu mdb2 kullanarak bir PHP uygulaması yapılması gerekiyor.

7 Cevap

IF EXISTS değiştirici henüz DROP INDEX veya CREATE INDEX için inşa edilmiştir. Ama bir dizin bırakarak / oluşturmadan önce varlığı için elle kontrol edebilirsiniz.

Dizin zaten var olup olmadığını kontrol etmek için bu cümleyi kullanın.

SHOW INDEX FROM table_name WHERE KEY_NAME = 'index_name'
  • Sorgu döndürür (0) daha sonra dizin var değil sıfır olursa, o zaman yaratabilirsiniz.
  • Sorgu sonra dizin var pozitif bir sayı, dönerse, o zaman bırakabilirsiniz.

İşte benim 4 liner:

set @exist := (select count(*) from information_schema.statistics where table_name = 'table' and index_name = 'index');
set @sqlstmt := if( @exist > 0, 'select ''INFO: Index already exists.''', 'create index i_index on tablename ( columnname )');
PREPARE stmt FROM @sqlstmt;
EXECUTE stmt;

İşte INDEX IF prosedürü VAR bir damla:

DELIMITER $$

DROP PROCEDURE IF EXISTS drop_index_if_exists $$
CREATE PROCEDURE drop_index_if_exists(in theTable varchar(128), in theIndexName varchar(128) )
BEGIN
 IF((SELECT COUNT(*) AS index_exists FROM information_schema.statistics WHERE TABLE_SCHEMA = DATABASE() and table_name =
theTable AND index_name = theIndexName) > 0) THEN
   SET @s = CONCAT('DROP INDEX ' , theIndexName , ' ON ' , theTable);
   PREPARE stmt FROM @s;
   EXECUTE stmt;
 END IF;
END $$

DELIMITER ;

Determining if MySQL table index exists before creating: Bu kod buradan prosedüre dayalı oluşturuldu

Bu yerleşik değil

Bununla birlikte,

http://old.nabble.com/how-to-%22drop-index-if-exists%22-td14024229.html

DROP INDEX IF MEVCUT uygulamak için bir saklı yordam yazmak için nasıl açıklar ve INDEX IF MEVCUT CREATE uygulamak için çalışmak için bu kodu değiştirmek oldukça kolay görünüyor

Burada sunulan çözümler bazı sorunlarınız. Bu ben ile geldi budur:

DELIMITER $$

DROP PROCEDURE IF EXISTS myschema.create_index_if_not_exists $$
CREATE PROCEDURE myschema.create_index_if_not_exists(in p_tableName VARCHAR(128), in p_indexName VARCHAR(128), in p_columnName VARCHAR(128) )
BEGIN

PREPARE stmt FROM 'SELECT @indexCount := COUNT(1) from information_schema.statistics WHERE `table_name` = ? AND `index_name` = ?';
SET @table_name = p_tableName;
SET @index_name = p_indexName;
EXECUTE stmt USING @table_name, @index_name;
DEALLOCATE PREPARE stmt;

-- select @indexCount;

IF( @indexCount = 0 ) THEN
  SELECT 'Creating index';
  SET @createIndexStmt = CONCAT('CREATE INDEX ', p_indexName, ' ON ', p_tableName, ' ( ', p_columnName ,')');
  PREPARE stmt FROM @createIndexStmt;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END IF;

END $$

DELIMITER ;

Aşağıdaki gibi kullanın:

call myschema.create_index_if_not_exists('MyTable','end_time_index','end_time');

Bu MySQL 5.5.21 ile MySQL 5.5.24 ile MAC OS X 10.8.2 ve Windows 7 üzerinde test edildi

Ben bırakarak & için aşağıdaki SPROCs ile gelip nereye burada ve başka bulundu cevapları tweaked dizinleri oluşturma. Gerekirse AddTableIndex sproc dizini bırakın unutmayın. Onlar da benim kullanımlar için kritik bir şema adı kabul edin.

DELIMITER //

DROP PROCEDURE IF EXISTS migrate.DropTableIndex //

CREATE PROCEDURE migrate.DropTableIndex
    (
        in schemaName varchar(128) -- If null use name of current schema;
        , in tableName varchar(128) -- If null an exception will be thrown.
        , in indexName varchar(128) -- If null an exception will be thrown.
    )
BEGIN
    SET schemaName = coalesce(schemaName, schema());
    IF((SELECT COUNT(*) AS index_exists FROM information_schema.statistics WHERE TABLE_SCHEMA = schemaName and table_name = tableName AND index_name = indexName) > 0) THEN
        SET @s = CONCAT('DROP INDEX `' , indexName , '` ON `' , schemaName, '`.`', tableName, '`');
        PREPARE stmt FROM @s;
        EXECUTE stmt;
    END IF;
END //

DROP PROCEDURE IF EXISTS migrate.AddTableIndex//

CREATE PROCEDURE migrate.AddTableIndex
    ( 
        IN schemaName varchar(128) -- If null use name of current schema;
        , IN tableName varchar(128) -- If null an exception will be thrown.
        , IN indexName varchar(128) -- If null an exception will be thrown.
        , IN indexDefinition varchar(1024) -- E.g. '(expireTS_ ASC)'
        , IN ifPresent ENUM('leaveUnchanged', 'dropAndReplace') -- null=leaveUnchanged.
        , OUT outcome tinyint(1) -- 0=unchanged, 1=replaced, 4=added.
    )
    BEGIN

    DECLARE doDrop tinyint(1) DEFAULT NULL;
    DECLARE doAdd tinyint(1) DEFAULT NULL;
    DECLARE tmpSql varchar(4096) DEFAULT '';

    SET schemaName = coalesce(schemaName, schema());
    SET ifPresent = coalesce(ifPresent, 'leaveUnchanged');
    IF EXISTS (SELECT * FROM   INFORMATION_SCHEMA.STATISTICS WHERE  table_schema = schemaName AND table_name = tableName AND index_name = indexName) THEN
        IF (ifPresent = 'leaveUnchanged') THEN
            SET doDrop = 0;
            SET doAdd = 0;
            SET outcome = 0;
            ELSEIF (ifPresent = 'dropAndReplace')
            THEN
            SET doDrop = 1;
            SET doAdd = 1;
            SET outcome = 1;
        END IF;
    ELSE
        SET doDrop = 0;
        SET doAdd = 1;
        SET outcome = 4;
    END IF;

    IF (doDrop = 1) THEN
        SET tmpSql = concat( 'alter table `', schemaName, '`.`', tableName, '` drop index `', indexName, '` ');
        SET @sql = tmpSql;
        PREPARE tmp_stmt FROM @sql;
        EXECUTE tmp_stmt;
        DEALLOCATE PREPARE tmp_stmt;
    END IF;

    IF (doAdd = 1) THEN
        SET tmpSql = concat( 'alter table `', schemaName, '`.`', tableName, '` add index `', indexName, '` (', indexDefinition, ')');
        SET @sql = tmpSql;
        PREPARE tmp_stmt FROM @sql;
        EXECUTE tmp_stmt;
        DEALLOCATE PREPARE tmp_stmt;
    END IF;

    END;
//

DELIMITER ;

Ben MySQL SELECT IF () deyimi kullanarak benzer bir şey var.

select if (
    exists(
        select distinct index_name from information_schema.statistics 
        where table_schema = 'schema_db_name' 
        and table_name = 'tab_name' and index_name like 'index_1'
    )
    ,'select ''index index_1 exists'' _______;'
    ,'create index index_1 on tab_name(column_name_names)') into @a;
PREPARE stmt1 FROM @a;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

If () deyimi kullanmanın avantajı yazılı olması herhangi bir prosedür ihtiyacı yok.