Postgres 将支持'UPSERT'功能, MySQL/MariaDB 哭昏在厕所 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
timbotetsu

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

  •  1
     
  •   timbotetsu 2015 年 5 月 8 日 7522 次点击
    这是一个创建于 4005 天前的主题,其中的信息可能已经有所发展或是发生改变。

    睡前顺手翻了一下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 年 5 月 8 日
    哈哈!这种心情是很少有人有的,我也喜欢postgreSQL,虽然我还没试过。
    wesley
        2
    wesley  
       2015 年 5 月 8 日
    mysql很早很早就有replace了
    skydiver
        3
    skydiver  
       2015 年 5 月 8 日
    mysql不是也有insert into on duplicate key update么
    HowardMei
        4
    HowardMei  
       2015 年 5 月 8 日
    除了Scalability不好,其它基本完美,中小型站或者重要数据选PG准没错,大型网站廉价数据还是MariaDB比较好
    timbotetsu
        5
    timbotetsu  
    OP
       2015 年 5 月 9 日
    @wesley
    @skydiver
    我提到MSSQL有merge,Oracle有merge into,而没说MySQL/MariaDB有类似的语句,是因为MySQL/MariaDB在使用与前两者类似的语句是有限制的

    @HowardMei
    Postgres目前就只有Clustering这块短板了,在PG、JSONB这些特性时是比MySQL/MariaDB要好 :)
    bigzhu
        6
    bigzhu  
       2015 年 5 月 9 日 via Android
    太棒了~那我就不需要用代码很低效的实现这个功能了
    est
        7
    est  
       2015 年 5 月 9 日
    @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 年 5 月 9 日
    @HowardMei MariaDB最近日子不好过。。。。。。。。。。Percona收购TokuDB,Oracle那帮牛人在5.7里给InnoDB搞了双倍属性加成。。。。。。。。。。。
    Narcissu5
        9
    Narcissu5  
       2015 年 5 月 9 日
    merge是典型的学院派语法,超级复杂,并不好用。这方面还是mysql的on duplicate key update简单易用。(不要小看“简单”的吸引力)
    timbotetsu
        10
    timbotetsu  
    OP
       2015 年 5 月 9 日
    @est
    Oracle有MERGE INTO用起来很舒服,MySQL尝试过更新多条数据但有多个Unique Index就无法用ON DUPLICATE KEYS

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

    在目前的特性和需求下我会选Postgres而不是选MySQL,所以会觉得MySQL会哭昏在厕所;MongoDB不是关系型数据库,所以我也没列入比较之中
    est
        11
    est  
       2015 年 5 月 9 日
    @timbotetsu 没on conflict 之前也有办法解决的:

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

    我一般用第二种,因为各种语言和框架里无论什么ORM里无须诡异写法都可以直接实现。基本可以应付。
    lilydjwg
        12
    lilydjwg  
       2015 年 6 月 19 日
    @est PostgreSQL 的 json 本来就是保存成字符串的啦。而且也不是没法做,只是没有内建的办法。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1265 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 63ms UTC 17:28 PVG 01:28 LAX 10:28 JFK 13:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86