2017-04-16 80 views
2

我嘗試將一些SQL Server模式更改轉換爲MySQL。我知道MySQL中的CREATE TABLE IF NOT EXISTS。我不認爲我可以在這裏使用。在MySQL中使用值插入創建冪等表和索引

我想要做的是在MySQL中創建一個帶有索引的表格,然後插入一些值作爲「if not exists」謂詞的一部分。這是我想出了,但它似乎並不奏效:

SET @actionRowCount = 0; 
SELECT COUNT(*) INTO @actionRowCount 
FROM information_schema.tables 
WHERE table_name = 'Action' 
LIMIT 1; 

IF @actionRowCount = 0 THEN 
    CREATE TABLE Action 
    (
     ActionNbr INT AUTO_INCREMENT, 
     Description NVARCHAR(256) NOT NULL, 
     CONSTRAINT PK_Action PRIMARY KEY(ActionNbr) 
    ); 

    CREATE INDEX IX_Action_Description 
    ON Action(Description); 

    INSERT INTO Action 
     (Description) 
    VALUES 
     ('Activate'), 
     ('Deactivate'), 
     ('Specified'); 
END IF 

我可以一次運行它,它會創建表,索引和值。如果我再次運行它,則會出現錯誤:Table Action already exists。如果表已經存在,我會認爲它根本不會運行。

引導模式時,我使用了這種模式。我如何在MySQL中執行此操作?

+0

一種選擇是使用存儲的過程,見[16年1月14日CREATE PROCEDURE和CREATE FUNCTION語法](https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html)。 – wchiquito

回答

1

實例:

選項1:

CREATE TABLE IF NOT EXISTS `Action` (
    `ActionNbr` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `Description` VARCHAR(255) NOT NULL, 
    INDEX `IX_Action_Description` (`Description`) 
) SELECT 'Activate' `Description` 
    UNION 
    SELECT 'Deactivate' 
    UNION 
    SELECT 'Specified'; 

選項2:

DROP PROCEDURE IF EXISTS `sp_create_table_Action`; 

DELIMITER // 

CREATE PROCEDURE `sp_create_table_Action`() 
BEGIN 
    IF NOT EXISTS(SELECT NULL 
      FROM `information_schema`.`TABLES` `ist` 
      WHERE `ist`.`table_schema` = DATABASE() AND 
       `ist`.`table_name` = 'Action') THEN 

     CREATE TABLE `Action` (
      `ActionNbr` INT AUTO_INCREMENT, 
      `Description` NVARCHAR(255) NOT NULL, 
      CONSTRAINT `PK_Action` PRIMARY KEY (`ActionNbr`) 
     ); 

     CREATE INDEX `IX_Action_Description` 
     ON `Action` (`Description`); 

     INSERT INTO `Action` 
      (`Description`) 
     VALUES 
      ('Activate'), 
      ('Deactivate'), 
      ('Specified'); 
    END IF; 
END// 

DELIMITER ; 

CALL `sp_create_table_Action`; 
2

在mysql中compound statements只能在存儲的程序中使用,其中也包括if語句。

因此,一種解決方案是將您的代碼包含在stored procedure中。

另一種解決方案是使用create table if not exists ...,並在表定義中包含單獨的索引創建,並使用insert ignoreinsert ... select ...來避免插入重複值。的選項