Nếu bảng tồn tại thả bảng thì tạo nó, nếu nó không tồn tại, chỉ cần tạo bảng


151

Tôi đã bối rối, tôi không biết làm thế nào để làm điều này.

Về cơ bản tôi chỉ muốn tạo một bảng, nhưng nếu nó tồn tại, nó cần được loại bỏ và tạo lại, không bị cắt cụt, nhưng nếu nó không tồn tại, chỉ cần tạo nó.

Bất cứ ai sẽ có thể giúp đỡ?

Cảm ơn, George


@Shomz, đó là những gì họ muốn. Tuy nhiên, sự tồn tại của câu hỏi này và lượt xem 20 nghìn cho trang này chứng tỏ rằng điều đó dễ như chuyển đổi tiếng Anh sang tiếng Hy Lạp.
Pacerier 20/03/2015

2
@Pacerier Không thể đồng ý nhiều hơn : διαγραφή πίνακα, εφόσον υπάρχει.
Shomz 20/03/2015

@Shomz, Có lỗi ngữ pháp.
Pacerier

Câu trả lời:


298

Chỉ cần đặt DROP TABLE IF EXISTS `tablename`;trước CREATE TABLEtuyên bố của bạn .

Câu lệnh đó làm rơi bảng nếu nó tồn tại nhưng sẽ không gây ra lỗi nếu không.


1
Cảm ơn! Điều này cũng hoạt động cho một danh sách các bảng hoặc khung nhìn! DROP TABLE IF EXISTS 'table1', 'table2';DROP VIEW IF EXISTS 'view1', 'view2';PS- Bạn đã sử dụng phù thủy nào để có mã nội tuyến!?
Campbeln ngày

2
@Campbeln Chỉ cần tăng gấp đôi số backticks trước và sau đoạn mã. Backticks duy nhất sau đó được hiển thị nguyên văn.
r3mainer

43

Chỉ cần sử dụng DROP TABLE IF EXISTS:

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

Hãy thử tìm kiếm tài liệu MySQL trước nếu bạn có bất kỳ vấn đề nào khác.


8

Chà ... Hừ. Trong nhiều năm không ai đề cập đến một điều tinh tế.

Mặc dù DROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );có vẻ hợp lý, nó dẫn đến một tình huống khi bảng cũ đã biến mất và bảng mới chưa được tạo: một số khách hàng có thể cố gắng truy cập bảng chủ đề ngay tại thời điểm này.

Cách tốt hơn là tạo một bảng hoàn toàn mới và trao đổi nó với một bảng cũ (nội dung bảng bị mất):

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`;
  • Bạn nên kiểm tra kết quả CREATE ...và không tiếp tục trong trường hợp có lỗi , vì thất bại có nghĩa là luồng khác không hoàn thành cùng một tập lệnh: vì nó bị lỗi ở giữa hoặc chưa hoàn thành - đó là một ý tưởng hay tự kiểm tra mọi thứ
  • Sau đó, bạn nên kiểm tra kết quả đầu tiên RENAME ...và không tiếp tục trong trường hợp thành công : toàn bộ hoạt động được hoàn thành thành công; thậm chí nhiều hơn, chạy tiếp theo RENAME ...có thể (và sẽ) không an toàn nếu một luồng khác đã bắt đầu trình tự tương tự (tốt hơn là bao gồm trường hợp này hơn là không che, xem ghi chú khóa bên dưới).
  • Nguyên RENAME ...tử thứ hai thay thế định nghĩa bảng, tham khảo hướng dẫn sử dụng MySQL để biết chi tiết.
  • Cuối cùng, DROP ...chỉ cần dọn dẹp bàn cũ, rõ ràng.

Kết hợp tất cả các câu lệnh với một cái gì đó như SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');cho phép gọi tất cả các câu lệnh một cách tuần tự mà không kiểm tra lỗi, nhưng tôi không nghĩ đó là một ý tưởng hay: tăng độ phức tạp và các chức năng khóa trong MySQL không an toàn cho sao chép dựa trên câu lệnh.

Nếu dữ liệu bảng sẽ tồn tại nâng cấp định nghĩa bảng ... Trong trường hợp chung, câu chuyện phức tạp hơn nhiều về việc so sánh các định nghĩa bảng để tìm ra sự khác biệt và đưa ra ALTER ...tuyên bố phù hợp , điều này không phải lúc nào cũng có thể tự động, ví dụ như khi các cột được đổi tên.

Lưu ý bên 1: Bạn có thể xử lý các chế độ xem bằng cách sử dụng cùng một cách tiếp cận, trong trường hợp này CREATE/DROP TABLEchỉ chuyển đổi thành CREATE/DROP VIEWtrong khi RENAME TABLEvẫn không thay đổi. Trong thực tế, bạn thậm chí có thể biến bảng thành xem và ngược lại.

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`;

Lưu ý phụ 2: Người dùng MariaDB nên hài lòng CREATE OR REPLACE TABLE/VIEW, điều này đã quan tâm đến vấn đề chủ đề và đó là điểm tốt.


1

Tôi cần phải thả một bảng và tạo lại với dữ liệu từ một khung nhìn. Tôi đã tạo một bảng ngoài tầm nhìn và đây là những gì tôi đã làm:

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

Ở trên đã làm việc cho tôi bằng cách sử dụng MySQL MariaDb.


thả bảng tên_bảng; tạo bảng khi chọn * từ chế độ xem;
sirskoy

Nếu bạn đang ở trên MariaDB (MySQL thiếu cái này), thì bạn có thể chỉ cầnCREATE OR REPLACE <table_name> AS SELECT * FROM <view>;
Alex Offshore
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.