나는 혼란스러워, 나는 이것을하는 방법을 모른다.
기본적으로 나는 테이블을 만들고 싶지만 테이블이 있으면 삭제하고 다시 작성하고 잘리지 않아야하지만 테이블이 없으면 테이블을 작성하십시오.
누구든지 도울 수 있을까?
고마워, 조지
답변
그냥 넣어 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를 사용하여 저에게 효과적이었습니다.