PostgreSQL on duplicate update

比如现在有个表,使用来控制用户访问页面权限的,

CREATE TABLE user_pages (
  id      SERIAL PRIMARY KEY,
  user_id INTEGER NOT NULL                  DEFAULT 0 ::INTEGER,
  page_id INTEGER NOT NULL                  DEFAULT 0 ::INTEGER,
  enabled BOOLEAN NOT NULL                  DEFAULT TRUE
);
create unique index uix_user_page on user_pages(user_id,page_id);

理论上每个人每个页面只应该有一条数据,但是我更改或者插入的时候想使用 insert on duplicate update 的功能, 可以使用 postgresql 提供的FUNCTION 功能

CREATE OR REPLACE FUNCTION replace_into_user_pages(u_id INTEGER, p_id INTEGER, en BOOLEAN)
  RETURNS BOOLEAN AS $$
BEGIN
  IF EXISTS(SELECT id FROM user_pages WHERE user_id = u_id AND page_id = p_id)
  THEN
    UPDATE user_pages SET enabled = en WHERE user_id = u_id AND page_id = p_id;
  ELSE
    INSERT INTO user_pages (user_id, page_id, enabled) VALUES (u_id, p_id, en);
  END IF;
  RETURN TRUE;
END;
$$ LANGUAGE plpgsql;

然后调用 SELECT replace_into_user_pages(1,1,false) 就行了,但是这样只能一条一条插入,在postgesql 大于等于 9.5的版本里面 ,提供了 on conflict 功能,

INSERT INTO user_pages (user_id, page_id, enabled)
VALUES (1, 1, TRUE), (1, 2, TRUE), (1, 3, FALSE)
ON CONFLICT (user_id, page_id)
  DO UPDATE SET enabled = EXCLUDED.enabled;

ref : 

    https://stackoverflow.com/questions/1109061/insert-on-duplicate-update-in-postgresql

    http://www.postgres.cn/docs/9.6/sql-insert.html

转载于:https://my.oschina.net/beetlerx/blog/1554475

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值