我已经阅读了UPSERT
PostgreSQL 中的不同实现,但所有这些解决方案都相对较旧或相对奇特(例如,使用可写 CTE)。
而且我根本不是 psql 专家,无法立即找出这些解决方案是否过时,因为它们被很好地推荐,或者它们(好吧,几乎所有这些都是)只是不适合生产使用的玩具示例。
在 PostgreSQL 中实现 UPSERT 的最线程安全的方法是什么?
这个答案向我提出了如何在这样的函数之间VALUES
和SELECT
中进行选择的问题。在 x86_64-unknown-linux-gnu 上使用PostgreSQL 9.4.3,由 gcc (Debian 4.9.2-10) 4.9.2, 64-bit 编译:
CREATE OR REPLACE FUNCTION insaft_function()
RETURNS TRIGGER AS
$func$
BEGIN
INSERT INTO file_headers (measurement_id, file_header_index_start
, file_header_index_end)
VALUES (NEW.measurement_id, TG_ARGV[0]::int, TG_ARGV[1]::int);
RETURN NULL; -- result ignored since this is an AFTER trigger
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
VALUES
处理多行,但SELECT
你可以做更多的事情。这里唯一的要求是对INSERT
表格执行上述操作。您可以假设INSERT
在系统的持续质量保证中每个周期完成100k 次这样的操作。
我注意到这些差异与我的数据不同,这里选择了三个中值:
VALUES
real user sys
-------------------------------
0m0.353s 0m0.256s 0m0.028s
0m0.327s 0m0.252s 0m0.036s
0m0.358s …
Run Code Online (Sandbox Code Playgroud) postgresql trigger performance select postgresql-performance
我有一个具有以下架构的数据库设置:
CREATE TABLE siteInfo (
siteID SERIAL NOT NULL,
siteName TEXT NOT NULL,
siteHost TEXT NOT NULL,
notes TEXT NOT NULL,
allowableCountries TEXT NOT NULL,
displayChance INT NOT NULL,
imagePath TEXT NOT NULL,
PRIMARY KEY (siteID)
);
CREATE TABLE siteLinks (
siteID SERIAL NOT NULL,
URL TEXT NOT NULL,
FOREIGN KEY (siteID) REFERENCES siteInfo(siteID) ON DELETE CASCADE
);
CREATE TABLE siteDemographicLinks (
siteID SERIAL NOT NULL,
URL TEXT NOT NULL,
country TEXT NOT NULL,
chance INT NOT NULL,
FOREIGN KEY …
Run Code Online (Sandbox Code Playgroud) 我有两个表可以执行一些批量插入:
第一INSERT
:
values_data = "($$key_1$$), ($$key_2$$)"
INSERT INTO key (key_name) VALUES values_data
Run Code Online (Sandbox Code Playgroud)
秒INSERT
:
values_data = "(1, `the id of the first value inserted in key`)
, (1, `the id of the sec value inserted in key`)"
INSERT INTO related_key (related_key_id, key_id) VALUES values_data
Run Code Online (Sandbox Code Playgroud)
我不知道如何做第二个,INSERT
因为我不知道如何为插入到key
表中的行获取这些 id 。
或者有没有更好的方法来做到这一点?
postgresql ×4
cte ×2
bulk-insert ×1
insert ×1
performance ×1
plpgsql ×1
select ×1
trigger ×1
upsert ×1