use*_*631 5 postgresql insert select referential-integrity
我有一个应用程序,其中有几台设备每秒向我的服务器发送数据。在数据库上,我有一个包含设备的表和另一个每秒发送数据的表。
设备第一次发送数据时,服务器脚本应INSERT
在设备表中注册 ( ) 该设备 ID 并将数据添加到数据表中。
我的问题是,什么会更快?
执行SELECT EXISTS
查询以确定INSERT
设备表中是否需要一个。如果SELECT EXISTS
返回 false 则执行 an 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
)
Run Code Online (Sandbox Code Playgroud)
在 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);
Run Code Online (Sandbox Code Playgroud)
显然, 必须有某种唯一索引或排除约束(device_id)
。
手册中的详细信息。
对于旧版本或自动生成的序列号:
归档时间: |
|
查看次数: |
2710 次 |
最近记录: |