Làm cách nào để chèn giá trị vào bảng từ truy vấn chọn trong PostgreSQL?


199

Tôi có một cái bàn items (item_id serial, name varchar(10), item_group int)và một cái bàn items_ver (id serial, item_id int, name varchar(10), item_group int).

Bây giờ tôi muốn chèn một hàng vào items_vertừ items. Có cú pháp SQL ngắn nào để làm việc này không?

Tôi đã thử với:

INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2);

nhưng tôi gặp lỗi cú pháp:

ERROR:  syntax error at or near "select"
LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item...

Bây giờ tôi đã thử:

INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

Nó hoạt động tốt hơn nhưng tôi gặp lỗi:

ERROR:  column "item_group" is of type integer but expression is of type 
character varying
LINE 1: INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

Điều này có thể là do các cột được xác định theo thứ tự khác nhau trong các bảng. Liệu thứ tự cột có vấn đề? Tôi hy vọng rằng PostgreSQL khớp với tên cột.

Câu trả lời:


288

Thứ tự cột không quan trọng vì vậy nếu (và chỉ khi) các đơn hàng cột khớp với bạn, ví dụ:

insert into items_ver
select * from items where item_id=2;

Hoặc nếu chúng không khớp, bạn có thể lấy ví dụ:

insert into items_ver(item_id, item_group, name)
select * from items where item_id=2;

nhưng dựa vào thứ tự cột là một lỗi đang chờ xảy ra (nó có thể thay đổi, cũng như số lượng cột) - nó cũng làm cho SQL của bạn khó đọc hơn

Không có 'phím tắt' tốt - bạn nên liệt kê rõ ràng các cột cho cả bảng bạn đang chèn và truy vấn bạn đang sử dụng cho dữ liệu nguồn, ví dụ:

insert into items_ver (item_id, name, item_group)
select item_id, name, item_group from items where item_id=2;

dbfiddle ở đây


5
INSERT INTO test_import_two (name, name1, name2) 
(SELECT name, name1, name2 FROM test_import_one WHERE id = 2)

Cho cùng một bảng

INSERT INTO test_import_three (id1, name1, name2) 
(SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4)

-1
INSERT INTO gate_pass(
     site_id, gate_pass_element, sequence_no, createdby, createddate, lastmodifiedby, lastmodifieddate)
SELECT 1,   gatepasselement, 3, 1,now(),1,now()  
FROM unnest(string_to_array('Bhushan,Amol,pallavi', E',')) as gatepasselement;
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.