V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
timbotetsu
V2EX  ›  PostgreSQL

Postgres 将支持'UPSERT'功能, MySQL/MariaDB 哭昏在厕所

  •  1
     
  •   timbotetsu · 2015-05-08 23:18:59 +08:00 · 6893 次点击
    这是一个创建于 3485 天前的主题,其中的信息可能已经有所发展或是发生改变。

    睡前顺手翻了一下Postgres的commit,兴奋得起来发帖

    https://github.com/postgres/postgres/commit/168d5805e4c08bed7b95d351bf097cff7c07dd65

    Postgres将会有INSERT ... ON CONFLICT DO NOTHING/UPDATE这样的语句,来支持在插入之前检测是否已经存在以及存在之后的操作

    MS SQL有merge,Oracle有merge into,之前在Postgres和MySQL之间摇摆,往后用新我将会直接选Postgres了:)

    发完贴我就睡觉,这次比支持jsonb还要兴奋!

    12 条回复    2015-06-19 23:06:14 +08:00
    hepin1989
        1
    hepin1989  
       2015-05-08 23:33:43 +08:00
    哈哈!这种心情是很少有人有的,我也喜欢postgreSQL,虽然我还没试过。
    wesley
        2
    wesley  
       2015-05-08 23:37:55 +08:00
    mysql很早很早就有replace了
    skydiver
        3
    skydiver  
       2015-05-08 23:40:45 +08:00
    mysql不是也有insert into on duplicate key update么
    HowardMei
        4
    HowardMei  
       2015-05-08 23:56:39 +08:00
    除了Scalability不好,其它基本完美,中小型站或者重要数据选PG准没错,大型网站廉价数据还是MariaDB比较好
    timbotetsu
        5
    timbotetsu  
    OP
       2015-05-09 06:38:23 +08:00
    @wesley
    @skydiver
    我提到MSSQL有merge,Oracle有merge into,而没说MySQL/MariaDB有类似的语句,是因为MySQL/MariaDB在使用与前两者类似的语句是有限制的

    @HowardMei
    Postgres目前就只有Clustering这块短板了,在PG、JSONB这些特性时是比MySQL/MariaDB要好 :)
    bigzhu
        6
    bigzhu  
       2015-05-09 08:17:28 +08:00 via Android
    太棒了~那我就不需要用代码很低效的实现这个功能了
    est
        7
    est  
       2015-05-09 09:16:55 +08:00
    @timbotetsu merge 和 on conflict 很不一样的。merge 是sql标准里的搞法。

    https://wiki.postgresql.org/wiki/UPSERT#Syntax_discussion

    pg的这个on conflict 和 mysql 的 on duplicate keys 更加接近。唯一的区别是mysql在多个唯一索引下不知道究竟是因为哪一个唯一限制不能insert。

    具体的讨论可以看这里 https://news.ycombinator.com/item?id=9510047

    没看出来为啥mysql 哭晕在厕所了。mongodb 更是n年前就有upsert 指令了。

    -----

    另外,pg的json也是半残废,没法原子操作,比如对 {"a": {"b": 1}} 没法让1原子自增成2 。几乎跟直接把json保存为字符串存起来没啥区别。最后,mysql 5.7也支持json了。

    https://www.percona.com/live/mysql-conference-2015/sites/default/files/slides/MySQL_5_7_JSON_PerconaLive2015.pdf
    est
        8
    est  
       2015-05-09 09:19:13 +08:00
    @HowardMei MariaDB最近日子不好过。。。。。。。。。。Percona收购TokuDB,Oracle那帮牛人在5.7里给InnoDB搞了双倍属性加成。。。。。。。。。。。
    Narcissu5
        9
    Narcissu5  
       2015-05-09 09:22:28 +08:00
    merge是典型的学院派语法,超级复杂,并不好用。这方面还是mysql的on duplicate key update简单易用。(不要小看“简单”的吸引力)
    timbotetsu
        10
    timbotetsu  
    OP
       2015-05-09 10:02:08 +08:00
    @est
    Oracle有MERGE INTO用起来很舒服,MySQL尝试过更新多条数据但有多个Unique Index就无法用ON DUPLICATE KEYS

    用Postgres是因为有PostGIS,碰到UPSERT操作时之前也只能想想MERGE INTO,然后自己得在访问数据库时做判断

    在目前的特性和需求下我会选Postgres而不是选MySQL,所以会觉得MySQL会哭昏在厕所;MongoDB不是关系型数据库,所以我也没列入比较之中
    est
        11
    est  
       2015-05-09 16:35:47 +08:00
    @timbotetsu 没on conflict 之前也有办法解决的:

    1. 用transaction
    2. 先insert,报错duplicate key异常后update

    我一般用第二种,因为各种语言和框架里无论什么ORM里无须诡异写法都可以直接实现。基本可以应付。
    lilydjwg
        12
    lilydjwg  
       2015-06-19 23:06:14 +08:00
    @est PostgreSQL 的 json 本来就是保存成字符串的啦。而且也不是没法做,只是没有内建的办法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:21 · PVG 03:21 · LAX 11:21 · JFK 14:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.