我们有很多数据库,我们正在尝试在所有数据库上运行升级脚本以使它们保持最新 - 因此,它们都有不同的列和表。
我们想要添加新的表和列,如果它们不存在,例如
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,那将非常感激。
答案 0 :(得分: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
语句。它的当前状态是Needs Triage。