Jika tabel ada drop table maka buatlah, jika tidak ada buat saja

151

Saya bingung, saya tidak tahu bagaimana cara melakukan ini.

Pada dasarnya saya hanya ingin membuat tabel, tetapi jika ada, harus dijatuhkan dan dibuat kembali, tidak dipotong, tetapi jika tidak ada, buat saja.

Adakah yang bisa membantu?

Terima kasih, George

George
sumber
@ Tom, Itu yang mereka inginkan. Namun keberadaan pertanyaan ini dan pandangan 20k ke halaman ini membuktikan bahwa itu semudah mengubah bahasa Inggris menjadi bahasa Yunani.
Pacerier
2
@Pacerier Could not agree more: διαγραφή πίνακα, εφόσον υπάρχει.
Shomz
@ Tom, Ada kesalahan tata bahasa.
Pacerier

Jawaban:

298

Letakkan DROP TABLE IF EXISTS `tablename`;sebelum CREATE TABLEpernyataan Anda .

Pernyataan itu menjatuhkan tabel jika ada tetapi tidak akan membuat kesalahan jika tidak.

G-Nugget
sumber
1
Terima kasih! Ini juga berfungsi untuk daftar tabel atau tampilan! DROP TABLE IF EXISTS 'table1', 'table2';dan DROP VIEW IF EXISTS 'view1', 'view2';PS- Sihir apa yang Anda gunakan untuk memiliki kode inline !?
Campbeln
2
@ Campbeln Cukup gandakan backtick sebelum dan sesudah segmen kode. Backtick tunggal kemudian ditampilkan secara verbatim.
r3mainer
43

Cukup gunakan DROP TABLE IF EXISTS:

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

Coba cari dokumentasi MySQL terlebih dahulu jika Anda memiliki masalah lain.

r3mainer
sumber
8

Baiklah ... Hah. Selama bertahun-tahun tidak ada yang menyebutkan satu hal yang halus.

Meskipun DROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... ); tampaknya masuk akal, ini mengarah ke situasi ketika tabel lama sudah hilang dan yang baru belum dibuat: beberapa klien mungkin mencoba mengakses tabel subjek tepat pada saat ini.

Cara yang lebih baik adalah membuat tabel baru dan menukarnya dengan yang lama (isi tabel hilang):

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`;
  • Anda harus memeriksa hasil CREATE ...dan jangan melanjutkan jika ada kesalahan , karena kegagalan berarti bahwa utas lain tidak menyelesaikan skrip yang sama: baik karena terhenti di tengah atau baru saja tidak selesai - itu ide yang baik untuk periksa semuanya sendiri.
  • Kemudian, Anda harus memeriksa hasilnya terlebih dahulu RENAME ...dan jangan melanjutkan jika berhasil : seluruh operasi berhasil diselesaikan; bahkan lebih, menjalankan selanjutnya RENAME ...dapat (dan akan) tidak aman jika utas lain sudah memulai urutan yang sama (lebih baik untuk menutup kasus ini daripada tidak untuk menutupi, lihat mengunci catatan di bawah).
  • Kedua RENAME ...secara atom menggantikan definisi tabel, lihat manual MySQL untuk detailnya.
  • Akhirnya, DROP ...membersihkan meja lama, jelas.

Membungkus semua pernyataan dengan sesuatu seperti SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');memungkinkan untuk menjalankan semua pernyataan secara berurutan tanpa pengecekan kesalahan, tapi saya rasa itu bukan ide yang bagus: kompleksitas meningkat dan fungsi penguncian di MySQL tidak aman untuk replikasi berbasis pernyataan.

Jika data tabel harus selamat dari peningkatan definisi tabel ... Untuk kasus umum, ini adalah cerita yang jauh lebih kompleks tentang membandingkan definisi tabel untuk menemukan perbedaan dan menghasilkan ALTER ...pernyataan yang tepat , yang tidak selalu memungkinkan secara otomatis, misalnya ketika kolom diganti nama.

Side note 1: Anda dapat menangani dengan pemandangan menggunakan pendekatan yang sama, dalam hal ini CREATE/DROP TABLEhanya mengubah ke CREATE/DROP VIEWsedangkan RENAME TABLEsisa-sisa tidak berubah. Bahkan Anda bahkan dapat mengubah tabel menjadi tampilan dan sebaliknya.

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

Catatan 2: Pengguna MariaDB harus senang CREATE OR REPLACE TABLE/VIEW, yang sudah peduli dengan masalah subjek dan itu poin yang baik.

Alex Offshore
sumber
1

Saya perlu menjatuhkan tabel dan membuat ulang dengan data dari tampilan. Saya membuat tabel di luar tampilan dan inilah yang saya lakukan:

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

Di atas bekerja untuk saya menggunakan MySQL MariaDb.

sirskoy
sumber
drop table table_name; buat tabel sebagai pilih * dari tampilan;
sirskoy
Jika Anda menggunakan MariaDB (MySQL tidak memiliki ini), maka Anda cukupCREATE OR REPLACE <table_name> AS SELECT * FROM <view>;
Alex Offshore