Postgresql
在插入中呼叫帶有參數的函式
是否有可能在 SQL 中優雅地實現以下目標:
insert into my_table (the_geom) VALUES geomfromwkb('\x010100000058b4b610a73a27408144b7147f194840',4326)), geomfromwkb('\x010100000058b4b610a73a27408144b7147f194840',4326)), .....
geomfromwkb
這涉及使用兩個參數呼叫外部函式?到目前為止,我有一個不優雅的解決方案。第一個解決方案是這種類型:
insert into mytable (the_geom) select geomfromwkb('\x010100000058b4b610a73a27408144b7147f194840',4326)) union geomfromwkb('\x010100000058b4b610a73a27408144b7147f194840',4326)) union .....
第二個使用prepare語句:
PREPARE my_insert AS INSERT INTO geom_example (the_geom) VALUES (geomfromwkb($1,4326)); EXECUTE my_insert ('\x010100000058b4b610a73a27408144b7147f194840'); EXECUTE my_insert ('\x010100000058b4b610a73a27408144b7147f194840'); statement: DEALLOCATE my_insert;
**問題一:**還有比這更優雅的嗎?
問題 2:當數據庫看到一堆聯合時,它會做什麼?
問題 3:prepare 真的比一個 fat insert 快嗎?
問題4:字節序列是幾何類型。是否可以跳過一致性檢查(以確保這確實是幾何字節序列)以加快插入速度?
您可以使用該子句建構一個“表”
VALUES
並在其之上建構函式呼叫:INSERT INTO wgs84 (wkb_geometry, wkb_geography) SELECT st_transform(st_setsrid(st_makepoint(col1, col2), col3), col4) FROM ( VALUES (694274.6998, 5341745.2959, 25832, 4326), ( 69425.6998, 5341754.23, 25834, 4327) ) t (col1, col2, col3, col4);
這比重複的函式呼叫更容易閱讀、編寫和修改。您甚至可以對齊數據,這有時會使查找錯誤變得更容易。
一個版本可以將其
VALUES
放入 WITH 查詢中。在某些情況下,最好將COPY
數據放入(最好使用命令)臨時表並在INSERT
語句中從中進行選擇 - 當輸入大小變大時,這會很方便。