문제

해당 열이 존재하는 경우 Alter를 사용하여 MySQL 테이블의 열을 삭제하는 방법은 무엇입니까?

나는 내가 사용할 수 있다는 것을 안다 ALTER TABLE my_table DROP COLUMN my_column, 그러나 그것은 오류가 발생합니다 my_column 존재하지 않는다. 열을 조건부로 삭제하기위한 대체 구문이 있습니까?

MySQL 버전 4.0.18을 사용하고 있습니다.

도움이 되었습니까?

해결책

MySQL의 경우 아무것도 없습니다. MySQL 기능 요청.

어쨌든 이것을 허용하는 것은 정말 나쁜 생각입니다. IF EXISTS 알려지지 않은 구조가있는 데이터베이스에서 파괴적인 작업을 실행하고 있음을 나타냅니다. 빠른 지역 작업에 수용 가능한 상황이있을 수 있지만, 생산 데이터 (마이그레이션 등)에 대해 그러한 진술을 실행하려는 유혹이 있다면 화재로 놀고 있습니다.

그러나 당신이 주장한다면, 고객의 먼저 존재를 확인하거나 오류를 포착하는 것은 어렵지 않습니다.

MariaDB는 또한 10.0.2로 시작하는 것도 지원합니다.

열]을 떨어 뜨립니다 [존재하는 경우] col_name

ALTER TABLE MY_TABLE DROP이 존재하는 경우 My_Column;

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

다른 팁

MySQL에는 이에 대한 언어 수준 지원이 없습니다. 다음은 5.0+의 MySQL Information_Schema Meta-Data와 관련된 작업 원칙입니다. 그러나 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;

나는 더 자세한 정보를 a 블로그 게시물.

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

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 ;

많은 시행 착오를 겪은 후 누군가가 나를 도와주기를 바랍니다.

방금 만드는 데 도움이되는 재사용 가능한 절차를 구축했습니다. DROP COLUMN idempotent :

-- column_exists:

DROP FUNCTION IF EXISTS column_exists;

DELIMITER $$
CREATE FUNCTION column_exists(
  tname VARCHAR(64),
  cname VARCHAR(64)
)
  RETURNS BOOLEAN
  READS SQL DATA
  BEGIN
    RETURN 0 < (SELECT COUNT(*)
                FROM `INFORMATION_SCHEMA`.`COLUMNS`
                WHERE `TABLE_SCHEMA` = SCHEMA()
                      AND `TABLE_NAME` = tname
                      AND `COLUMN_NAME` = cname);
  END $$
DELIMITER ;

-- drop_column_if_exists:

DROP PROCEDURE IF EXISTS drop_column_if_exists;

DELIMITER $$
CREATE PROCEDURE drop_column_if_exists(
  tname VARCHAR(64),
  cname VARCHAR(64)
)
  BEGIN
    IF column_exists(tname, cname)
    THEN
      SET @drop_column_if_exists = CONCAT('ALTER TABLE `', tname, '` DROP COLUMN `', cname, '`');
      PREPARE drop_query FROM @drop_column_if_exists;
      EXECUTE drop_query;
    END IF;
  END $$
DELIMITER ;

용법:

CALL drop_column_if_exists('my_table', 'my_column');

예시:

SELECT column_exists('my_table', 'my_column');       -- 1
CALL drop_column_if_exists('my_table', 'my_column'); -- success
SELECT column_exists('my_table', 'my_column');       -- 0
CALL drop_column_if_exists('my_table', 'my_column'); -- success
SELECT column_exists('my_table', 'my_column');       -- 0

Chase Seibert의 답변이 작동하지만 여러 차례의 스키마가 있으면 선택을 변경하려고합니다.

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

나는이 스레드가 지금 꽤 오래되었다는 것을 알고 있지만 같은 문제가있었습니다. 이것은 MySQL 워크 벤치를 사용하는 매우 기본적인 솔루션 이었지만 잘 작동했습니다 ...

  1. 새 SQL 편집기를 받고 쇼 테이블을 실행하여 테이블 목록을 얻으십시오.
  2. 모든 행을 선택하고 상황에 맞는 메뉴에서 클립 보드 (인용되지 않은) 복사를 선택하십시오.
  3. 이름 목록을 다른 편집기 탭에 붙여 넣습니다
  4. 쿼리, 즉 Alter Table을 작성하십시오 x 하락 a;
  5. 복사 및 붙여 넣기를 수행하므로 각 테이블마다 별도의 쿼리로 끝납니다.
  6. 오류가 발생할 때 워크 벤치가 중지되어야하는지 전환합니다.
  7. 실행을 누르고 출력 로그를 살펴보십시오

테이블이있는 테이블은 이제 로그에 오류가 표시되지 않은 테이블이 없습니다.

그런 다음 '드롭을 찾거나 교체 할 수 있습니다 a'변경'을 추가하십시오. 열을 추가하십시오 b int null '등을 다시 실행합니다 ....

약간 어리석지 만 마침내 최종 결과를 얻고 전체 프로세스를 제어/모니터링하고 다시 필요한 경우 SQL 스크립트를 저장하는 것을 기억할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top