[有条件地添加/删除列MySQL

问题描述 投票:0回答:1

我正在尝试将列插入表中。诸如DROP COLUMN IF EXISTS之类的任何东西都不起作用(删除和添加列均不起作用),显然是因为我的MySQ L版本不支持此类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继续吗?

mysql conditional-statements information-schema
1个回答
0
投票

您可以使用存储过程来实现此功能,该存储过程将数据库名称,表名称,列名称和列定义作为输入,如果指定表中不存在该列名称,则创建一个动态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')
© www.soinside.com 2019 - 2024. All rights reserved.