SEÇİN TABLO OLUŞTURMA


16

PostgreSQL destekliyor CREATE TABLE ASve SELECT INTOher ikisini de ne zaman kullanacağım?

CREATE TABLE AS - bir sorgunun sonuçlarından yeni bir tablo tanımlama

CREATE TABLE ASbir tablo oluşturur ve bir SELECTkomutla hesaplanan verilerle doldurur . Tablo sütunları, SELECT(yeni sütun adlarının açık bir listesini vererek sütun adlarını geçersiz kılabilirsiniz) öğesinin çıktı sütunlarıyla ilişkili adlara ve veri türlerine sahiptir .

CREATE TABLE ASbir görünüm oluşturmak için biraz benzerlik gösterir, ancak gerçekten farklıdır: yeni bir tablo oluşturur ve yeni tabloyu başlangıçta doldurmak için sorguyu yalnızca bir kez değerlendirir. Yeni tablo, sorgunun kaynak tablolarında yapılan sonraki değişiklikleri izlemez. Buna karşılık, bir görünüm SELECTsorgulandığında tanımlayıcı ifadesini yeniden değerlendirir .

Ve sonra.

SELECT INTO - bir sorgunun sonuçlarından yeni bir tablo tanımlama

SELECT INTOyeni bir tablo oluşturur ve bir sorgu tarafından hesaplanan verilerle doldurur. Veriler normalde olduğu gibi istemciye döndürülmez SELECT. Yeni tablonun sütunları, öğesinin çıktı sütunlarıyla ilişkili adlara ve veri türlerine sahiptir SELECT.

Yanıtlar:


15

Açıklama olmadan, her zaman CREATE TABLE ASistisnasız kullanın . NOTLAR altında her birinin altında bu temizlenir,

İçin notlar SELECT INTO,

CREATE TABLE ASişlevsel olarak benzer SELECT INTO. CREATE TABLE ASbu sözdizimi, SELECT INTOECPG veya PL / pgSQL'de bulunmadığından, INTO yantümcesini farklı yorumladıkları için önerilen sözdizimidir . Ayrıca, CREATE TABLE AStarafından sağlanan işlevin bir üst kümesini sunar SELECT INTO.

İçin notlar CREATE TABLE AS,

Bu komut işlevsel olarak benzerdir SELECT INTO, ancak sözdiziminin diğer kullanımlarıyla karıştırılma olasılığı daha azSELECT INTO olduğu için tercih edilir . Ayrıca, CREATE TABLE AStarafından sunulan işlevin bir üst kümesini sunar SELECT INTO.

Ayrıca dokümanlarının Uyumluluk bölümünde SELECT INTOdaha da ileri gider,

SQL standardı, SELECT INTOyeni bir tablo oluşturmak yerine bir ana bilgisayar programının skaler değişkenlerine değer seçmeyi temsil etmek için kullanır . Bu gerçekten ECPG (bkz. Bölüm 34) ve PL / pgSQL'de (bkz. Bölüm 41) bulunan kullanımdır. Tablo oluşturmayı temsil etmek için PostgreSQL kullanımı SELECT INTOtarihseldir. CREATE TABLE ASBu amaçla yeni kodda kullanmak en iyisidir .

Böylece sahibiz,

  1. PostgreSQL kafa karıştırıcı olduğunu düşünüyor çünkü SELECT INTObağlamlardaki diğer şeyler sadece PL / pgSQL ve ECPG'de mevcut.
  2. CREATE TABLEdaha fazla işlevselliği destekler (bahsettiklerini varsayıyorum WITH OIDS, ve TABLESPACE, IF NOT EXISTS).
  3. SELECT INTO tablo oluşturmak için "kullanımdan kaldırıldı".

Bir yan not olarak, CTE'li bir CTAS sözdizimi biraz garip görünebilir. Ve SELECT INTO olabilecek da üzerinde beklemeye çeşit QUEL enRETRIEVE INTO . QUEL, SQL'in öncüsüdür ve PostgreSQL (INGRES) öncülüdür.


1

Kabul ettiğim cevapta eksik olduğunu fark ettiğim bir şey daha var. Kullanmak CREATE TABLE AS, her bir sütunun göz ardı edildiği görünen nullable özelliğini korur SELECT INTO.

Sadece bu temelde, tavsiye ederim CREATE TABLE AS. Her iki ifade için yaygın bir kullanım durumu, sorgunuzun süresi boyunca o tabloyu kilitlemeden uzun süren bir sorgudan tabloya veri yüklemektir. Yukarıdaki komutlardan birini kullanarak geçici bir tablo oluşturun, uzun süren sorgu sonuçlarını oraya koyun ve sonra bu sonuçları özgün tabloya ekleyin. Geçici tablonuzdaki null edilebilir özniteliği korumak, ikinci ekinizin başarısız olma olasılığını azaltır.

Bunu PG 11'de test ettik, bu yüzden bu soru cevaplandığından beri daha yeni bir özellik.


Uzun süren bir sorgu hiçbir tabloyu kilitlemez. İçin CTA'lar kullanmak motivasyon Yani o nedenle beyhudedir
a_horse_with_no_name
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.