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 ... endはSQLServerの構文です。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には、ストアドプロシージャの外部のステートメントを許可するためのオープンリクエストがあります。現在のステータスはNeedsTriageです。

于 2012-04-11T12:54:37.250 に答える