MySQL 테이블의 열을 삭제하는 구문은 버전 4.0.18에 있습니까?MySQL 존재하는 경우 열을 삭제하는 구문을 변경하십시오.
답변
MySQL의 경우에는MySQL Feature Request이 없습니다.
어쨌든 이것을 허용하는 것은 틀림없이 아주 나쁜 생각입니다. IF EXISTS
은 알려지지 않은 구조로 데이터베이스에서 파괴적인 작업을 실행 중임을 나타냅니다. 이 작업이 신속하고 지저분한 지역 작업에는 용인 될 수있는 상황이있을 수 있지만, 마이그레이션 등에서 생산 데이터에 대해 그러한 진술을 실행하고 싶다면 화재로 놀고있는 것입니다.
그러나 주장하는 경우 단순히 클라이언트에서 존재를 확인하거나 오류를 잡기가 어렵지 않습니다. COL_NAME
I [있으면]
DROP [COLUMN]
MariaDB도 10.0.2로 시작하는 다음을 지원한다. 이자형.
변경 테이블 my_table DROP IF EXISTS my_column;
그러나 MySQL의 여러 포크 중 하나에서만 지원되는 비표준 기능에 의존하는 것은 잘못된 생각입니다.
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에 기록했습니다.
DrHyde의 기여를 설명으로 요약하는 것이 중요하다고 생각했다. 왜냐하면 그것이 자신의 답변에있을 때 분명하지 않기 때문이다. SELECT * INFORMATION_SCHEMA.COLUMNS 에서 테이블 _ = "국가"와 COLUMN_NAME = "updated_at"AND TABLE_SCHEMA = DATABASE이() G – Homer6
\ 원하지 않는 경우 WHERE : 당신이 당신의 다른 데이터베이스를 수정하지 있는지 확인하십시오 "drop procedure if existing schema_change;"에서 경고를 얻으려면 "set sql_notes = 0;"을 추가하십시오. 첫 줄 앞에 추가하고 "set sql_notes = 1;"을 추가하십시오. 마지막 라인 이후. 세부 정보 -> http://stackoverflow.com/questions/27616564/suppress-mysql-warnings – csonuryilmaz
체이스 Seibert는의 응답 작품,하지만 난 당신이 몇 가지 도식이있는 경우, 따라서 SELECT를 변경하려는 것을 추가 할 것 :
select * from information_schema.columns where table_schema in (select schema()) and table_name=...
내가 실현이 스레드는 이제 꽤 오래된, 그러나 나는이를 구비 한 문제. 이것은 MySQL Workbench를 사용하는 아주 기본적인 솔루션 이었지만 제대로 작동했습니다 ...
- 는 목록을 붙여 새 SQL 편집기를 얻고
- 는 모든 행을 선택하여 테이블의 목록을 가져올 쇼 테이블을 실행하고 상황에 맞는 메뉴
- 에서 (인용 부호로 둘러싸이지 않은) 클립 보드에 복사를 선택합니다 다른 편집기 탭에 이름을 입력하십시오.
- , 즉 ALTER TABLE
x
DROPa
; - 는 일부 복사 및 붙여 넣기를 할 수 있으므로 오류가
- 히트 실행 및 출력 로그
하나를 통해보고 발생하면 워크 벤치가 중지할지 여부를 토글 각 테이블
은 당신이 찾을 수있는 로그에 오류를 표시 한 것입니다하지 않았다 어떤 테이블이/교체 'a
드롭'등에 'COLUMN b
INT의 NULL 추가'로 변경 d 다시 모든 것을 실행하십시오 ....
마지막으로 최종 결과를 얻고 전체 프로세스를 제어/모니터하고 필요할 때를 대비해 SQL 스크립트를 저장하는 것을 기억하십시오.
나는 이것이 오래된 스레드라는 것을 알고 있지만 저장 프로 시저를 사용하지 않고이 요구 사항을 처리하는 간단한 방법이 있습니다. 이것은 누군가를 도울 수 있습니다.
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 ;
호프가 나를 돕기를 원합니다. (많은 시행 착오 끝에).
예! 오늘 많이 도움이되었습니다. 감사. –
순수 SQL에서이를 수행 할 수있는 방법이 있습니까? – Tom
와우. 9 년 전인 2005 년에 언급되었습니다. 나는 이것이 우선 순위 목록에 있음을 짐작하고있다 ... – crmpicco
MariaDB는 10.0.2부터 시작한다. – Dfr