当你正在执行一次 upsert 行(PostgreSQL >= 9.5)时,如果你希望可能的 INSERT 与可能的 UPDATE 完全相同,你可以按照以下方式编写它:
当你正在执行一次upsert行(PostgreSQL >= 9.5)时,如果你希望可能的INSERT与可能的UPDATE完全相同,你可以这样写:
INSERT INTO tablename (id, username, password, level, email)
VALUES (1, 'John', 'qwerty', 5, 'john@mail.com')
ON CONFLICT (id) DO UPDATE SET
id=EXCLUDED.id, username=EXCLUDED.username,
password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email
有没有更简短的方法?只需说:使用所有排除值。
在SQLite中,我过去经常这样做:
INSERT OR REPLACE INTO tablename (id, user, password, level, email)
VALUES (1, 'John', 'qwerty', 5, 'john@mail.com')
将数据插入表中,列名为id、username、password、level和email,对应的值为1、'John'、'qwerty'、5和'john@mail.com'。如果id已存在,则执行更新操作,将username、password、level和email更新为新的值(EXCLUDED表示新插入的值,保持原有的列名)。
为了方便复制/粘贴/管理列名,可以将上述语句稍作修改,如下所示:INSERT INTO tablename (id, username, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') ON CONFLICT (id) DO UPDATE SET username = EXCLUDED.username, password = EXCLUDED.password, level = EXCLUDED.level, email = EXCLUDED.email;
- foalid
,因为它是相同的(冲突字段)。这样会稍微简短一些。 - milan