테이블이 테이블 삭제 존재하면 작성하십시오. 존재하지 않는 경우 작성하십시오.


151

나는 혼란스러워, 나는 이것을하는 방법을 모른다.

기본적으로 나는 테이블을 만들고 싶지만 테이블이 있으면 삭제하고 다시 작성하고 잘리지 않아야하지만 테이블이 없으면 테이블을 작성하십시오.

누구든지 도울 수 있을까?

고마워, 조지


@Shomz, 그것이 그들이 원하는 것입니다. 그러나이 질문의 존재와이 페이지에 대한 20k 뷰는 영어를 그리스어로 변환하는 것만 큼 쉽다는 것을 증명합니다.
Pacerier

2
@Pacerier 더 동의 할 수 없습니다 : διαγραφή πίνακα, εφόσον υπάρχει.
Shomz

@Shomz, 문법 오류가 있습니다.
Pacerier

답변:


298

그냥 넣어 DROP TABLE IF EXISTS `tablename`;당신의 전 CREATE TABLE문.

이 명령문은 테이블이 존재하는 경우 테이블을 삭제하지만 테이블이 없으면 오류를 발생시키지 않습니다.


1
감사! 이것은 또한 테이블 또는 뷰 목록에도 적용됩니다! DROP TABLE IF EXISTS 'table1', 'table2';그리고 DROP VIEW IF EXISTS 'view1', 'view2';PS- 인라인 코드에서 어떤 마법을 사용 했습니까?
Campbeln

2
@Campbeln 코드 세그먼트 전후에 백틱을 두 배로 늘리십시오. 그런 다음 단일 백틱이 그대로 표시됩니다.
r3mainer

43

그냥 사용하십시오 DROP TABLE IF EXISTS:

DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` ( ... );

다른 문제가 있으면 먼저 MySQL 설명서를 검색하십시오 .


8

글쎄 ... 허. 몇 년 동안 아무도 미묘한 것을 언급하지 않았습니다.

에도 불구하고 DROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );합리적인 것 같다 이전 테이블이 이미 사라지고 새가 아직 생성되지 않은 경우, 그것은 상황에 이르게 : 일부 클라이언트가 바로이 순간에 액세스 주제 테이블에 시도 할 수 있습니다.

더 좋은 방법은 새로운 테이블을 만들고 오래된 테이블로 교체하는 것입니다 (테이블 내용이 손실 됨).

CREATE TABLE `bla__new` (id int); /* if not ok: terminate, report error */
RENAME TABLE `bla__new` to `bla`; /* if ok: terminate, report success */
RENAME TABLE `bla` to `bla__old`, `bla__new` to `bla`;
DROP TABLE IF EXISTS `bla__old`;
  • failure는 다른 스레드가 동일한 스크립트를 완료하지 않았 음을 의미하므로 오류 의 결과를 확인하고 CREATE ...계속하지 않아야합니다. 중단 에서 충돌했거나 아직 완료되지 않았기 때문입니다. 직접 검사하십시오.
  • 그런 다음 먼저 결과를 확인하고 성공한 경우RENAME ... 계속하지 마십시오 . 전체 작업이 성공적으로 완료되었습니다. 더 나아가, 다음 스레드를 실행 하면 다른 스레드가 이미 동일한 시퀀스를 시작한 경우 안전하지 않을 수 있습니다 (이 경우는 다루지 않는 것보다 다루는 것이 좋습니다. 아래의 잠금 참고 참조).RENAME ...
  • 두 번째는 RENAME ...원자 적으로 테이블 정의를 대체합니다 . 자세한 내용 은 MySQL 매뉴얼 을 참조하십시오.
  • 마지막으로 DROP ...분명히 오래된 테이블을 정리하십시오.

같은 문장으로 모든 문장을 감싸면 SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');오류 검사없이 모든 문장을 순차적으로 호출 할 수 있지만 MySQL의 복잡성 증가 및 잠금 기능은 문장 기반 복제에 안전하지 않습니다.

테이블 데이터가 테이블 정의 업그레이드에서 살아남 아야하는 경우 ... 일반적인 경우, 테이블 정의를 비교하여 차이점을 찾고 적절한 ALTER ...명령문을 생성하는 방법에 대한 훨씬 더 복잡한 이야기 입니다. 예를 들어 열 이름을 바꿀 때 항상 자동으로 가능하지는 않습니다.

사이드 참고 1 : 이 경우에 동일한 방법을 사용하여 뷰를 해결할 수있는 CREATE/DROP TABLE단지로 변환 CREATE/DROP VIEW하는 동안 RENAME TABLE남아 변경. 실제로 테이블을 뷰로 또는 그 반대로 할 수도 있습니다.

CREATE VIEW `foo__new` as ...; /* if not ok: terminate, report error */
RENAME TABLE `foo__new` to `foo`; /* if ok: terminate, report success */
RENAME TABLE `foo` to `foo__old`, `foo__new` to `foo`;
DROP VIEW IF EXISTS `foo__old`;

참고 2 : MariaDB 사용자는 CREATE OR REPLACE TABLE/VIEW이미 주제 문제에 관심이 있고 좋은 점에 만족해야합니다.


1

테이블을 삭제하고 뷰의 데이터로 다시 만들어야했습니다. 뷰에서 테이블을 만들고 있었고 이것이 내가 한 일입니다.

DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;

위의 내용은 MySQL MariaDb를 사용하여 저에게 효과적이었습니다.


테이블 삭제 테이블 _ 이름; 뷰에서 select *로 테이블을 작성하십시오.
sirskoy

만약 당신이 MariaDB에 있다면 (MySQL은 이것이 없다), 당신은 간단히 할 수있다CREATE OR REPLACE <table_name> AS SELECT * FROM <view>;
Alex Offshore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.