Postgresql
SELECT + INSERT 或單獨 INSERT
我有一個應用程序,其中幾個設備每秒向我的伺服器發送數據。在數據庫上,我有一個包含設備的表和另一個包含每秒發送數據的表。
設備第一次發送數據時,伺服器腳本應
INSERT
在設備表中註冊 () 該設備 id 並將數據添加到數據表中。我的問題是,什麼會更快?
- 進行
SELECT EXISTS
查詢以確定INSERT
設備表上是否需要一個。如果SELECT EXISTS
返回 false 則執行一個INSERT
,否則什麼也不做。- 總是執行一個
INSERT
語句。考慮到設備 id 是表上的主鍵,如果設備已經存在,它將返回錯誤,否則將插入它。只有設備第一次發送數據時才需要實際的
INSERT
,之後就不再INSERT
需要了。PostgreSQL 版本是 9.4。
設備表定義如下:
CREATE TABLE common.tag ( customer integer, hostname character varying(150), description text, model integer, configprofile integer, id character varying(150) NOT NULL, host integer, CONSTRAINT tag_pk PRIMARY KEY (id), CONSTRAINT tag_fk_client FOREIGN KEY (customer) REFERENCES common.customer (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT tag_fk_configprofile FOREIGN KEY (configprofile) REFERENCES common.configprofile (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT tag_fk_tagmodel FOREIGN KEY (model) REFERENCES common.tagmodel (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION )
在 Postgres 9.5中,最優雅、簡單、安全和快速的解決方案是新的UPSERT 實現:
INSERT INTO device (device_id) VALUES (1234567) ON CONFLICT (device_id) DO NOTHING; -- now we have either inserted the device or it was there already INSERT INTO data (device_id, data) VALUES (1234567, 'some data);
顯然, 上必須有某種唯一索引或排除約束
(device_id)
。對於舊版本或自動生成的序列號: