2008-10-06 3 views

답변

37

MySQL의 경우에는MySQL Feature Request이 없습니다.

어쨌든 이것을 허용하는 것은 틀림없이 아주 나쁜 생각입니다. IF EXISTS은 알려지지 않은 구조로 데이터베이스에서 파괴적인 작업을 실행 중임을 나타냅니다. 이 작업이 신속하고 지저분한 지역 작업에는 용인 될 수있는 상황이있을 수 있지만, 마이그레이션 등에서 생산 데이터에 대해 그러한 진술을 실행하고 싶다면 화재로 놀고있는 것입니다.

그러나 주장하는 경우 단순히 클라이언트에서 존재를 확인하거나 오류를 잡기가 어렵지 않습니다. COL_NAME

I [있으면]

DROP [COLUMN]

MariaDB도 10.0.2로 시작하는 다음을 지원한다. 이자형.

변경 테이블 my_table DROP IF EXISTS my_column;

그러나 MySQL의 여러 포크 중 하나에서만 지원되는 비표준 기능에 의존하는 것은 잘못된 생각입니다.

+7

순수 SQL에서이를 수행 할 수있는 방법이 있습니까? – Tom

+7

와우. 9 년 전인 2005 년에 언급되었습니다. 나는 이것이 우선 순위 목록에 있음을 짐작하고있다 ... – crmpicco

+3

MariaDB는 10.0.2부터 시작한다. – Dfr

40

MySQL에 대한 언어 수준 지원이 없습니다. 여기에 5.0 +에서 MySQL information_schema 메타 데이터를 사용하는 방법이 있지만 4.0.18에서이 문제를 해결할 수는 없습니다.

drop procedure if exists schema_change; 

delimiter ';;' 
create procedure schema_change() begin 

    /* delete columns if they exist */ 
    if exists (select * from information_schema.columns where table_schema = schema() and table_name = 'table1' and column_name = 'column1') then 
     alter table table1 drop column `column1`; 
    end if; 
    if exists (select * from information_schema.columns where table_schema = schema() and table_name = 'table1' and column_name = 'column2') then 
     alter table table1 drop column `column2`; 
    end if; 

    /* add columns */ 
    alter table table1 add column `column1` varchar(255) NULL; 
    alter table table1 add column `column2` varchar(255) NULL; 

end;; 

delimiter ';' 
call schema_change(); 

drop procedure if exists schema_change; 

좀 더 자세한 정보는 blog post에 기록했습니다.

+3

DrHyde의 기여를 설명으로 요약하는 것이 중요하다고 생각했다. 왜냐하면 그것이 자신의 답변에있을 때 분명하지 않기 때문이다. SELECT * INFORMATION_SCHEMA.COLUMNS 에서 테이블 _ = "국가"와 COLUMN_NAME = "updated_at"AND TABLE_SCHEMA = DATABASE이() G – Homer6

+0

\ 원하지 않는 경우 WHERE : 당신이 당신의 다른 데이터베이스를 수정하지 있는지 확인하십시오 "drop procedure if existing schema_change;"에서 경고를 얻으려면 "set sql_notes = 0;"을 추가하십시오. 첫 줄 앞에 추가하고 "set sql_notes = 1;"을 추가하십시오. 마지막 라인 이후. 세부 정보 -> http://stackoverflow.com/questions/27616564/suppress-mysql-warnings – csonuryilmaz

5

체이스 Seibert는의 응답 작품,하지만 난 당신이 몇 가지 도식이있는 경우, 따라서 SELECT를 변경하려는 것을 추가 할 것 :

select * from information_schema.columns where table_schema in (select schema()) and table_name=... 
-1

내가 실현이 스레드는 이제 꽤 오래된, 그러나 나는이를 구비 한 문제. 이것은 MySQL Workbench를 사용하는 아주 기본적인 솔루션 이었지만 제대로 작동했습니다 ...

  1. 는 목록을 붙여 새 SQL 편집기를 얻고
  2. 는 모든 행을 선택하여 테이블의 목록을 가져올 쇼 테이블을 실행하고 상황에 맞는 메뉴
  3. 에서 (인용 부호로 둘러싸이지 않은) 클립 보드에 복사를 선택합니다 다른 편집기 탭에 이름을 입력하십시오.
  4. , 즉 ALTER TABLE x DROP a;
  5. 는 일부 복사 및 붙여 넣기를 할 수 있으므로 오류가
  6. 히트 실행 및 출력 로그

하나를 통해보고 발생하면 워크 벤치가 중지할지 여부를 토글 각 테이블

  • 에 대해 별도의 쿼리와 끝까지 표를 가지고 테이블 지금

    은 당신이 찾을 수있는 로그에 오류를 표시 한 것입니다하지 않았다 어떤 테이블이/교체 'a 드롭'등에 'COLUMN b INT의 NULL 추가'로 변경 d 다시 모든 것을 실행하십시오 ....

    마지막으로 최종 결과를 얻고 전체 프로세스를 제어/모니터하고 필요할 때를 대비해 SQL 스크립트를 저장하는 것을 기억하십시오.

  • 4

    나는 이것이 오래된 스레드라는 것을 알고 있지만 저장 프로 시저를 사용하지 않고이 요구 사항을 처리하는 간단한 방법이 있습니다. 이것은 누군가를 도울 수 있습니다.

    set @exist_Check := (
        select count(*) from information_schema.columns 
        where TABLE_NAME='YOUR_TABLE' 
        and COLUMN_NAME='YOUR_COLUMN' 
        and TABLE_SCHEMA=database() 
    ) ; 
    set @sqlstmt := if(@exist_Check>0,'alter table YOUR_TABLE drop column YOUR_COLUMN', 'select ''''') ; 
    prepare stmt from @sqlstmt ; 
    execute stmt ; 
    

    호프가 나를 돕기를 원합니다. (많은 시행 착오 끝에).

    +0

    예! 오늘 많이 도움이되었습니다. 감사. –