mysql ALTER TABLE if列不存在

Bru*_*lho 46 mysql ddl alter-table

我有这个代码:

ALTER TABLE `settings`
ADD COLUMN `multi_user` TINYINT(1) NOT NULL DEFAULT 1
Run Code Online (Sandbox Code Playgroud)

并且我想仅在此列不存在时才更改此表.

我正在尝试很多不同的方法,但没有任何作用:

ALTER TABLE `settings`
ADD COLUMN IF NOT EXISTS `multi_user` TINYINT(1) NOT NULL DEFAULT 1
Run Code Online (Sandbox Code Playgroud)

用程序:

DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
    DECLARE _count INT;
    SET _count = (  SELECT COUNT(*) 
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE   TABLE_NAME = 'settings' AND 
                            COLUMN_NAME = 'multi_user');
    IF _count = 0 THEN
        ALTER TABLE `settings` ADD COLUMN `multi_user` TINYINT(1) NOT NULL DEFAULT 1
    END IF;
END $$
DELIMITER ; 
Run Code Online (Sandbox Code Playgroud)

我在END IF中出错,然后在END中然后在1中出错

我怎样才能让它变得尽可能简单?

Har*_*rsh 39

在存储过程中使用以下内容:

IF NOT EXISTS( SELECT NULL
            FROM INFORMATION_SCHEMA.COLUMNS
           WHERE table_name = 'tablename'
             AND table_schema = 'db_name'
             AND column_name = 'columnname')  THEN

  ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0';

END IF;
Run Code Online (Sandbox Code Playgroud)

  • "[I] na存储过程"值得在此重述.以上是有效的T-SQL,并且在过去几年中主要使用它,在重新阅读这篇文章之前,我正在敲打一下. (9认同)
  • 这仅适用于MySQL 5.0更新版本. (6认同)
  • 那么,例如,您将如何在临时脚本中做到这一点?这个答案在 sql server 中可以很好地工作,但是 MySql 对我来说真的很痛苦?!?! (3认同)

aba*_*het 33

使用PREPARE/ EXECUTE并查询架构.主机无需具有创建或运行过程的权限:

SET @dbname = DATABASE();
SET @tablename = "tableName";
SET @columnname = "colName";
SET @preparedStatement = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (table_name = @tablename)
      AND (table_schema = @dbname)
      AND (column_name = @columnname)
  ) > 0,
  "SELECT 1",
  CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " INT(11);")
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
Run Code Online (Sandbox Code Playgroud)


rau*_*fer 32

这是一个不涉及查询的解决方案,INFORMATION_SCHEMA如果列确实存在,它只是忽略错误.

DROP PROCEDURE IF EXISTS `?`;
DELIMITER //
CREATE PROCEDURE `?`()
BEGIN
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
  ALTER TABLE `table_name` ADD COLUMN `column_name` INTEGER;
END //
DELIMITER ;
CALL `?`();
DROP PROCEDURE `?`;
Run Code Online (Sandbox Code Playgroud)

PS随意给它别的名字,而不是 ?

  • 我很惊讶这个答案并没有更好的排名.有什么理由吗?看起来很优雅. (4认同)
  • 通过此存储过程,我可以节省资源来首先检查表是否存在。很棒的答案,这应该被选为最佳答案。 (3认同)
  • @johnktejik 尝试调用 mysqli_query() 4 次,每个命令单独调用一次:第 1 行、第 3-7 行(省略第 7 行的 // 分隔符)、第 9 行和第 10 行。 (2认同)

Jon*_*han 7

如果不存在则添加字段

CALL addFieldIfNotExists ('settings', 'multi_user', 'TINYINT(1) NOT NULL DEFAULT 1');
Run Code Online (Sandbox Code Playgroud)

addFieldIfNotExists代码:

DELIMITER $$

DROP PROCEDURE IF EXISTS addFieldIfNotExists 
$$

DROP FUNCTION IF EXISTS isFieldExisting 
$$

CREATE FUNCTION isFieldExisting (table_name_IN VARCHAR(100), field_name_IN VARCHAR(100)) 
RETURNS INT
RETURN (
    SELECT COUNT(COLUMN_NAME) 
    FROM INFORMATION_SCHEMA.columns 
    WHERE TABLE_SCHEMA = DATABASE() 
    AND TABLE_NAME = table_name_IN 
    AND COLUMN_NAME = field_name_IN
)
$$

CREATE PROCEDURE addFieldIfNotExists (
    IN table_name_IN VARCHAR(100)
    , IN field_name_IN VARCHAR(100)
    , IN field_definition_IN VARCHAR(100)
)
BEGIN

    SET @isFieldThere = isFieldExisting(table_name_IN, field_name_IN);
    IF (@isFieldThere = 0) THEN

        SET @ddl = CONCAT('ALTER TABLE ', table_name_IN);
        SET @ddl = CONCAT(@ddl, ' ', 'ADD COLUMN') ;
        SET @ddl = CONCAT(@ddl, ' ', field_name_IN);
        SET @ddl = CONCAT(@ddl, ' ', field_definition_IN);

        PREPARE stmt FROM @ddl;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

    END IF;

END;
$$
Run Code Online (Sandbox Code Playgroud)


Ezh*_*hil 5

希望对你有帮助

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tbl_name'
AND table_schema = 'db_name'
AND column_name = 'column_name'
Run Code Online (Sandbox Code Playgroud)

要么

delimiter '//'

CREATE PROCEDURE addcol() BEGIN
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS
WHERE COLUMN_NAME='new_column' AND TABLE_NAME='tablename' AND TABLE_SCHEMA='the_schema'
)
THEN
    ALTER TABLE `the_schema`.`the_table`
    ADD COLUMN `new_column` TINYINT(1) NOT NULL DEFAULT 1;;

END IF;
END;
//

delimiter ';'

CALL addcol();

DROP PROCEDURE addcol;
Run Code Online (Sandbox Code Playgroud)


Adi*_*lla 5

我使用了这种方法(不使用存储过程):

SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tbl_name' AND COLUMN_NAME = 'column_name'

如果它没有返回任何行,则该列不存在,然后更改表:

ALTER TABLE tbl_name ADD COLUMN column_name TINYINT(1) NOT NULL DEFAULT 1

希望这可以帮助。