有条件地添加/删除列MySQL

时间:2019-11-22 11:01:24

标签: mysql conditional-statements information-schema

我正在尝试将列插入表中(如果尚未存在的话)。像DROP COLUMN IF EXISTS之类的东西都不起作用(删除和添加列均不起作用),显然是因为我的MySQL版本不支持这种if条件。 我的问题是,是否可以根据CASE语句在表中插入列?

我已经弄清楚了如何确定一列是否存在,但是我正在根据这种情况努力插入一列。

我想工作的case statement看起来像这样:

    CASE WHEN    (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS
                 WHERE TABLE_SCHEMA='PSIP-1.Standardproject_V2.5_notvalid'
                 AND TABLE_NAME='PS_Relevant Rail Stations$Loc'
                 AND COLUMN_NAME='triade') 
    IS NULL THEN 
    ALTER TABLE PS_Relevant Rail Stations$Loc
    ADD COLUMN triade;

我也不确定将此CASE statement放在哪里,因为此代码本身无法运行。我需要从UPDATE PS_Relevant Rail Stations$Loc开始,然后从CASE继续吗?

1 个答案:

答案 0 :(得分:1)

您可以使用存储过程实现此功能,该存储过程将输入数据库名称,表名称,列名称和列定义作为输入,如果指定表中不存在该列名称,则创建一个动态SQL语句来创建它。例如:

DELIMITER //

DROP PROCEDURE IF EXISTS add_column_if_not_exists //

CREATE PROCEDURE add_column_if_not_exists(IN dbname VARCHAR(50), 
                                          IN tblname VARCHAR(50), 
                                          IN colname VARCHAR(50),
                                          IN coltype VARCHAR(50))
BEGIN
  IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
                 WHERE TABLE_SCHEMA=dbname
                 AND TABLE_NAME=tblname
                 AND COLUMN_NAME=colname) THEN
    SET @sql = CONCAT('ALTER TABLE `', dbname, '`.`', tblname, '` ADD COLUMN `', colname, '` ', coltype);
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
  END IF;
END //

DELIMITER ;

然后您将这样调用此过程(适当修改列定义)

CALL add_column_if_not_exists('PSIP-1.Standardproject_V2.5_notvalid',
                              'PS_Relevant Rail Stations$Loc',
                              'triade',
                              'INT NOT NULL DEFAULT 0')

请注意,如果您有特定情况,例如它始终在同一表中的同一列中,您只需在查询中对这些值进行硬编码并删除相应的输入参数即可。