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

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

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

누구든지 도울 수 있을까?

고마워, 조지



답변

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

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


답변

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

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

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


답변

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

에도 불구하고 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이미 주제 문제에 관심이 있고 좋은 점에 만족해야합니다.


답변

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

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

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


답변