2017-04-16 40 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 ...来避免插入重复值。的选项