2012-04-11 51 views
2

我们有相当多的数据库,我们正在试图运行升级所有这些脚本给他们带来最新的 - 正因为如此,他们都有不同的列和表。SQL添加新列忽略重复

我们要添加新的表和列,如果他们arent已经存在,所以例如

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,这将不胜感激。

回答

3

if ... begin ... end是SQL 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中,你不能在命令行中键入compound statements。他们必须在功能或存储过程中。例如:

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; 

有一个open request on the MySQL bug tracker允许存储程序之外if语句。目前的状态是需要分类。

+0

我试过了,但它仍然抛出一个无效的语法错误: 您的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的正确语法手册“IF NOT EXISTS(SELECT * FROM information_schema.columns在列名=‘CUS’在行1 – Toby 2012-04-11 13:05:52