TẠO BẢNG NHƯ vs CHỌN VÀO


16

PostgreSQL hỗ trợ CREATE TABLE ASSELECT INTOkhi nào tôi sử dụng cả hai?

CREATE TABLE AS - xác định một bảng mới từ kết quả của một truy vấn

CREATE TABLE AStạo một bảng và điền vào nó với dữ liệu được tính bằng SELECTlệnh. Các cột trong bảng có tên và kiểu dữ liệu được liên kết với các cột đầu ra của SELECT(ngoại trừ việc bạn có thể ghi đè tên cột bằng cách đưa ra một danh sách rõ ràng các tên cột mới).

CREATE TABLE ASmang một số điểm tương đồng để tạo ra một khung nhìn, nhưng nó thực sự khá khác biệt: nó tạo ra một bảng mới và đánh giá truy vấn chỉ một lần để điền vào bảng mới ban đầu. Bảng mới sẽ không theo dõi các thay đổi tiếp theo đối với các bảng nguồn của truy vấn. Ngược lại, một khung nhìn đánh giá lại SELECTtuyên bố xác định của nó bất cứ khi nào nó được truy vấn.

Và sau đó.

SELECT INTO - xác định một bảng mới từ kết quả của một truy vấn

SELECT INTOtạo một bảng mới và điền vào nó với dữ liệu được tính toán bởi một truy vấn. Dữ liệu không được trả về cho khách hàng, vì nó là bình thường SELECT. Các cột của bảng mới có tên và kiểu dữ liệu được liên kết với các cột đầu ra của SELECT.

Câu trả lời:


15

Không có lời giải thích, luôn luôn sử dụng CREATE TABLE ASmà không có ngoại lệ. Ở dưới cùng của mỗi bên dưới LƯU Ý, điều này sẽ bị xóa,

Ghi chú cho SELECT INTO,

CREATE TABLE AScó chức năng tương tự như SELECT INTO. CREATE TABLE ASlà cú pháp được đề xuất, vì hình thức SELECT INTOnày không có sẵn trong ECPG hoặc PL / pgSQL, vì chúng diễn giải mệnh đề INTO khác nhau. Hơn nữa, CREATE TABLE AScung cấp một superset của các chức năng được cung cấp bởi SELECT INTO.

Ghi chú cho CREATE TABLE AS,

Lệnh này có chức năng tương tự như SELECT INTO, nhưng nó được ưa thích hơn vì nó ít bị nhầm lẫn với các cách sử dụng SELECT INTOcú pháp khác. Hơn nữa, CREATE TABLE AScung cấp một superset của các chức năng được cung cấp bởi SELECT INTO.

Ngoài ra trong phần Tương thích của các tài liệu của SELECT INTOnó còn đi xa hơn nữa,

Tiêu chuẩn SQL sử dụng SELECT INTOđể biểu diễn việc chọn các giá trị thành các biến vô hướng của chương trình máy chủ, thay vì tạo một bảng mới. Đây thực sự là cách sử dụng được tìm thấy trong ECPG (xem Chương 34) và PL / pgSQL (xem Chương 41). Việc sử dụng PostgreSQL SELECT INTOđể thể hiện việc tạo bảng là lịch sử. Tốt nhất là sử dụng CREATE TABLE AScho mục đích này trong mã mới.

Vì vậy chúng tôi có,

  1. PostgreSQL nghĩ rằng nó khó hiểu vì SELECT INTOcác công cụ khác trong ngữ cảnh chỉ có sẵn trong PL / pgQuery và ECPG.
  2. CREATE TABLEhỗ trợ nhiều chức năng hơn (tôi cho rằng họ đang đề cập đến WITH OIDS, và TABLESPACE, IF NOT EXISTS).
  3. SELECT INTO để tạo bảng là "không dùng nữa".

Là một lưu ý phụ, cú pháp cho CTAS với CTE có thể trông hơi lạ. và cũng SELECT INTO có thể là một số loại nắm giữ của QUELRETRIEVE INTO . QUEL là tiền thân của SQL, tiền thân của PostgreSQL (INGRES) đã sử dụng.


1

Có một điều khác tôi nhận thấy rằng thiếu từ câu trả lời được chấp nhận. Sử dụng CREATE TABLE ASbảo tồn thuộc tính nullable của mỗi cột dường như bị bỏ qua SELECT INTO.

Chỉ trên cơ sở này thôi, tôi khuyên bạn nên CREATE TABLE AS. Trường hợp sử dụng chung cho cả hai câu lệnh là tải dữ liệu từ một truy vấn chạy dài vào một bảng mà không khóa bảng đó trong suốt thời gian truy vấn của bạn. Bạn tạo một bảng tạm thời bằng một trong các lệnh trên, đặt kết quả truy vấn chạy dài vào đó và sau đó chèn các kết quả đó vào bảng gốc. Giữ nguyên thuộc tính nullable trong bảng tạm thời của bạn sẽ giảm khả năng lỗi chèn thứ hai của bạn.

Đã thử nghiệm điều này trên PG 11, vì vậy có lẽ một tính năng mới hơn vì câu hỏi này đã được trả lời.


Một truy vấn chạy dài không khóa bất kỳ bảng nào. Vì vậy, động lực sử dụng CTAS cho rằng lý do là vô ích
a_horse_with_no_name
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.