Tablo varsa, açılan tabloyu oluşturun, yoksa oluşturun.


151

Stumped, bunu nasıl yapacağımı bilmiyorum.

Temel olarak sadece bir tablo oluşturmak istiyorum, ancak eğer varsa, düşürülmeli ve yeniden oluşturulmalı, kesilmemeli, ancak yoksa sadece oluşturmalısınız.

Herkes yardım edebilir mi?

Teşekkürler George


@Shomz, İstedikleri buydu. Yine de bu sorunun varlığı ve bu sayfaya 20 bin görüş, bunun İngilizceyi Yunancaya dönüştürmek kadar kolay olduğunu kanıtlıyor.
Pacerier

2
@Pacerier daha anlaşamadı: διαγραφή πίνακα, εφόσον υπάρχει.
Shomz

@Shomz, Dilbilgisi hatası var.
Pacerier

Yanıtlar:


298

Sadece ifadenizin DROP TABLE IF EXISTS `tablename`;önüne koyun CREATE TABLE.

Bu ifade, varsa tabloyu düşürür, ancak yoksa hata atmaz.


1
Teşekkürler! Bu aynı zamanda tablo veya görünüm listesi için de geçerlidir! DROP TABLE IF EXISTS 'table1', 'table2';ve DROP VIEW IF EXISTS 'view1', 'view2';PS- Satır içi kodunuz olması için hangi büyücülük kullandınız?
Campbeln

2
@Campbeln Kod bölümünden önce ve sonra backtickleri ikiye katlayın. Daha sonra tek tırnaklar aynen gösterilir.
r3mainer

43

Sadece kullanın DROP TABLE IF EXISTS:

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

Başka sorunlarınız varsa önce MySQL belgelerini aramayı deneyin .


8

Şey ... Ha. Yıllarca kimse ince bir şeyden bahsetmedi.

Rağmen DROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );makul görünüyor eski tablo zaten gitti ve yenisi henüz oluşturulmadı zaman, bir duruma yol açar: Bazı istemci su anda erişim konusu masaya deneyebilir.

Daha iyi bir yol, yepyeni bir tablo oluşturmak ve eskisiyle değiştirmek (tablo içeriği kaybolur):

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`;
  • Hata sonucunu kontrol etmelisiniz ve hata durumundaCREATE ... devam etmemelisiniz , çünkü başarısızlık diğer iş parçacıkları aynı komut dosyasını bitirmediği anlamına gelir: ya ortada çöktüğü ya da henüz bitirmediği için - bu iyi bir fikirdir şeyleri kendiniz kontrol edin.
  • Ardından, önce sonucunu kontrol etmeli RENAME ...ve başarı durumunda devam etmemelisiniz : tüm işlem başarıyla tamamlandı; daha da fazlası, RENAME ...başka bir iş parçacığı aynı sırayla başlatılmışsa , sonraki çalıştırma güvenli olmayabilir (ve olacaktır) (bu durumu kapsamamaktan ziyade kapsamak daha iyidir, aşağıdaki kilitleme notuna bakın).
  • İkincisi RENAME ...atomik olarak tablo tanımının yerini alır, ayrıntılar için MySQL kılavuzuna bakın.
  • Sonunda, DROP ...sadece eski masayı temizler.

Gibi bir şey ile tüm ifadeleri kaydırma SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');sadece hata denetimi olmadan tüm ifadeleri sırayla çağırmak için izin verir, ancak bunun iyi bir fikir olduğunu sanmıyorum: MySQL karmaşıklık artar ve kilitleme işlevleri deyim tabanlı çoğaltma için güvenli değildir.

Tablo verilerinin tablo tanımı güncellemesinden sağ çıkması gerekiyorsa ... Genel durumda, farklılıkları bulmak ve doğru ALTER ...ifadeleri üretmek için tablo tanımlarını karşılaştırmak çok daha karmaşık bir hikaye .

Yan Not 1: Bu durumda aynı yaklaşımı kullanarak görünümleri, başa çıkabilirim CREATE/DROP TABLEsadece dönüşmektedir CREATE/DROP VIEWise RENAME TABLEdeğişmeden kalır. Aslında tabloyu görünüme veya tam tersine bile dönüştürebilirsiniz.

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

Yan not 2: MariaDB kullanıcıları CREATE OR REPLACE TABLE/VIEW, konu sorununu zaten önemseyen mutlu olmalı ve iyi noktalar.


1

Bir tablo bırakmak ve bir görünümden bir veri ile yeniden oluşturmak gerekiyordu. Bir görünümden bir tablo oluşturmak ve ben yaptım:

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

Yukarıdaki benim için MySQL MariaDb kullanarak çalıştı.


açılan tablo table_name; görünümden select * olarak tablo oluştur;
sirskoy

MariaDB'de iseniz (MySQL bunu içermez), o zaman sadeceCREATE OR REPLACE <table_name> AS SELECT * FROM <view>;
Alex Offshore
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.