สร้างตารางเทียบกับเลือกเข้า


16

PostgreSQL รองรับCREATE TABLE ASและSELECT INTOเมื่อใดที่ฉันจะใช้ทั้งสอง

CREATE TABLE AS - กำหนดตารางใหม่จากผลลัพธ์ของแบบสอบถาม

CREATE TABLE ASสร้างตารางและเติมด้วยข้อมูลที่คำนวณโดยSELECTคำสั่ง คอลัมน์ตารางมีชื่อและประเภทข้อมูลที่เชื่อมโยงกับคอลัมน์ผลลัพธ์ของSELECT(ยกเว้นว่าคุณสามารถแทนที่ชื่อคอลัมน์ได้โดยให้รายชื่อคอลัมน์ใหม่ที่ชัดเจน)

CREATE TABLE ASมีความคล้ายคลึงกับการสร้างมุมมอง แต่มันค่อนข้างแตกต่างกันมาก: มันสร้างตารางใหม่และประเมินแบบสอบถามเพียงครั้งเดียวเพื่อเติมตารางใหม่ในตอนแรก ตารางใหม่จะไม่ติดตามการเปลี่ยนแปลงที่ตามมาของตารางต้นฉบับของแบบสอบถาม ในทางตรงกันข้ามมุมมองประเมินSELECTคำสั่งที่กำหนดอีกครั้งเมื่อใดก็ตามที่มันถูกสอบถาม

และจากนั้น

SELECT INTO - กำหนดตารางใหม่จากผลลัพธ์ของแบบสอบถาม

SELECT INTOสร้างตารางใหม่และเติมด้วยข้อมูลที่คำนวณโดยแบบสอบถาม SELECTข้อมูลจะไม่ได้กลับไปยังลูกค้าตามที่มีปกติ SELECTคอลัมน์ตารางใหม่มีชื่อและข้อมูลที่เกี่ยวข้องกับประเภทคอลัมน์การส่งออกของ

คำตอบ:


15

หากไม่มีคำอธิบายให้ใช้CREATE TABLE ASโดยไม่มีข้อยกเว้น ที่ด้านล่างของแต่ละภายใต้หมายเหตุนี้จะถูกล้างขึ้น

หมายเหตุสำหรับSELECT INTO,

CREATE TABLE ASSELECT INTOเป็นหน้าที่คล้ายกับ CREATE TABLE ASเป็นไวยากรณ์ที่แนะนำเนื่องจากรูปแบบSELECT INTOนี้ไม่สามารถใช้ได้ใน ECPG หรือ PL / pgSQL เพราะพวกเขาตีความข้อ INTO แตกต่างกัน นอกจากนี้ยังCREATE TABLE ASมีฟังก์ชั่นการใช้งานที่SELECT INTOเหนือกว่า

หมายเหตุสำหรับCREATE TABLE AS,

คำสั่งนี้คล้ายกับการใช้SELECT INTOงาน แต่เป็นที่ต้องการเนื่องจากมีโอกาสน้อยที่จะสับสนกับการใช้SELECT INTOไวยากรณ์อื่น ๆ นอกจากนี้ยังCREATE TABLE ASมีฟังก์ชั่นที่SELECT INTOเหนือกว่าจาก

นอกจากนี้ในส่วนความเข้ากันได้ของเอกสารSELECT INTOนั้นยิ่งเพิ่มมากขึ้น

มาตรฐาน SQL ใช้SELECT INTOเพื่อแสดงค่าการเลือกลงในตัวแปรสเกลาร์ของโปรแกรมโฮสต์แทนที่จะสร้างตารางใหม่ นี่คือการใช้งานที่พบใน ECPG (ดูบทที่ 34) และ PL / pgSQL (ดูบทที่ 41) การใช้ PostgreSQL SELECT INTOเพื่อแสดงถึงการสร้างตารางเป็นเรื่องในอดีต เป็นการดีที่สุดที่จะใช้CREATE TABLE ASเพื่อวัตถุประสงค์นี้ในรหัสใหม่

ดังนั้นเราจึงมี

  1. PostgreSQL คิดว่ามันสับสนเพราะSELECT INTOทำสิ่งอื่นในบริบทที่มีเฉพาะใน PL / pgSQL และ ECPG
  2. CREATE TABLEรองรับการใช้งานมากขึ้น (ฉันคิดว่าพวกเขากำลังอ้างถึงWITH OIDSและTABLESPACE, IF NOT EXISTS)
  3. SELECT INTO สำหรับการสร้างตารางเป็น "เลิก"

ในฐานะที่เป็นบันทึกย่อด้านไวยากรณ์สำหรับCTAS กับ CTE อาจดูแปลก ๆ และSELECT INTO อาจระงับQUEL บางประเภทได้RETRIEVE INTOเช่นกัน QUEL เป็นรุ่นก่อนสำหรับ SQL ซึ่งใช้ก่อนหน้ากับ PostgreSQL (INGRES)


1

มีอีกอย่างหนึ่งที่ฉันสังเกตเห็นว่าหายไปจากคำตอบที่ยอมรับได้ ใช้ CREATE TABLE ASรักษาแอตทริบิวต์ nullable SELECT INTOของแต่ละคอลัมน์ซึ่งดูเหมือนว่าจะได้รับการปฏิเสธโดย

CREATE TABLE ASเพียงบนพื้นฐานนี้คนเดียวที่ฉันขอแนะนำให้ กรณีการใช้งานทั่วไปสำหรับทั้งสองคำสั่งคือการโหลดข้อมูลจากคิวรีที่ใช้เวลานานลงในตารางโดยไม่ต้องล็อกตารางนั้นในช่วงเวลาของเคียวรีของคุณ คุณสร้างตารางชั่วคราวโดยใช้คำสั่งข้างต้นอย่างใดอย่างหนึ่งใส่ผลลัพธ์แบบสอบถามยาวที่ทำงานอยู่ในนั้นและจากนั้นแทรกผลลัพธ์เหล่านั้นลงในตารางต้นฉบับ การเก็บรักษาแอตทริบิวต์ที่ไม่สามารถใช้ได้ในตารางชั่วคราวของคุณจะช่วยลดโอกาสที่เม็ดมีดที่สองของคุณจะล้มเหลว

ทดสอบสิ่งนี้กับ PG 11 ดังนั้นอาจเป็นคุณลักษณะที่ใหม่กว่านับตั้งแต่ตอบคำถามนี้


แบบสอบถามที่ใช้เวลานานไม่ได้ล็อคตารางใด ๆ ดังนั้นแรงจูงใจที่จะใช้สำหรับ CTAS ว่าเหตุผลที่ไร้ประโยชน์
a_horse_with_no_name
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.