4

我们有很多数据库,我们正在尝试在所有数据库上运行升级脚本以使它们保持最新 - 因此,它们都有不同的列和表。

如果它们不存在,我们想添加新的表和列,例如

CREATE TABLE IF NOT EXISTS `orders` ( `id` INT (11) NOT NULL , 
    `value` VARCHAR (50) , `designId` INT (11) , PRIMARY KEY ( `id`)); 

这行得通,但我们正在为列寻找相同类型的解决方案。我们当前的解决方案抛出错误代码:1060 - 列名重复。

ALTER TABLE `orders` ADD COLUMN `customer` INT (1) NULL; 

我从garry passarella尝试了以下操作,但我收到一个错误,声称 sql 语法不正确:

IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'orders' AND COLUMN_NAME = 'customer') 
    BEGIN  ALTER TABLE orders
    ADD customer BIT DEFAULT NULL
END

如果我们可以使用某些东西来让每一行忽略重复项,或者让整个脚本忽略错误代码 1060,我们将不胜感激。

4

1 回答 1

3

if ... begin ... endSQL Server 语法。对于 MySQL,它更像是if ... then ... end if

if not exists (select * from information_schema.columns
    where column_name = 'customer' and table_name = 'orders') then
    alter table orders add customer int(1) null;
end if

回复您的评论:在 MySQL 中,您不能在命令行中键入复合语句。它们必须在函数或存储过程中。例如:

drop procedure if exists sp_addcolumn;

delimiter //
create procedure sp_addcolumn()
begin
  if not exists (select * from INFORMATION_SCHEMA.COLUMNS 
      where table_name = 'orders' and column_name = 'customer') then
    alter table `orders` add column `customer` int(1) null;
  end if;
end//

delimiter ;
call sp_addcolumn;

MySQL 错误跟踪器上有一个开放请求,以允许if存储过程之外的语句。它的当前状态是需要分类。

于 2012-04-11T12:54:37.250 回答