栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Postgresql批处理插入或忽略

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Postgresql批处理插入或忽略

3个 挑战。

  1. 您的查询在表和之间没有

    JOIN
    条件,这实际上使其受到限制-您很可能不希望这样做。即,每个合格的电话都与合格的每个组结合在一起。如果您有100部电话和100个群组,那么已经是10,000个组合。
    phones``groups``CROSS JOIN

  2. 插入以下内容的 不同 组合

    (group_id, phone_name)

  3. 避免插入table中 已经存在的

    group_phones

所有考虑到的事物可能看起来像这样:

INSERT INTO group_phones(group_id, phone_name)SELECt i.id, i.nameFROM  (    SELECt **DISTINCT** g.id, p.name -- get distinct combinations    FROM   phones p    JOIN   groups g ON **??how are p & g connected??**    WHERe  g.id IN ($add_groups)    AND    p.name IN ($phones)    ) i**LEFT   JOIN** group_phones gp ON (gp.group_id, gp.phone_name) = (i.id, i.name)**WHERe  gp.group_id IS NULL**  -- avoid duping existing rows

并发

这种形式将并发写入操作的竞争条件的可能性降到最低。 如果 您的表具有 较大的并发写入
负载,则可能要排他地锁定表或使用可序列化的事务隔离,这可以防止在约束验证(行)之间的微小时隙中并发事务更改行的可能性极小不存在)和查询中的写操作。

BEGIN ISOLATION LEVEL SERIALIZABLE;INSERT ...COMMIT;

如果事务因序列化错误而回滚,请准备好重复该事务。

通常,尽管如此,您甚至都不需要理会这些。

表现

LEFT JOIN tbl ON right_col = left_col WHERe right_col IS NULL

通常是最快的方法,在右表中有不同的列。如果您的栏中有重复项(特别是如果有很多),

WHERe NOT EXISTS (SELECt 1 FROM tbl WHERe right_col = left_col)

可能更快,因为一旦找到第一行它就可以停止扫描。

您也可以使用

IN
@dezso演示的,但是在PostgreSQL中通常较慢。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369488.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号