Tag: upsert

如何用SqlAlchemy做一个upsert?

我有一个logging,如果它不存在,如果它已经存在(主键存在),我想要存在数据库中的字段被更新为当前状态。 这通常被称为upsert 。 下面的不完整的代码片段演示了什么可以工作,但似乎过于笨重(特别是如果有更多的列)。 什么是更好/最好的方式? Base = declarative_base() class Template(Base): __tablename__ = 'templates' id = Column(Integer, primary_key = True) name = Column(String(80), unique = True, index = True) template = Column(String(80), unique = True) description = Column(String(200)) def __init__(self, Name, Template, Desc): self.name = Name self.template = Template self.description = Desc def UpsertDefaultTemplate(): sess = […]

PostgreSQL INSERT ON CONFLICT 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 有一个更短的路? 只是说:使用所有的EXCLUDE值。 在SQLite中,我曾经这样做过: INSERT OR REPLACE INTO tablename (id, user, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com')

如何使用PostgreSQL中的ON CONFLICT返回?

我在PostgreSQL 9.5中有以下的UPSERT: INSERT INTO chats ("user", "contact", "name") VALUES ($1, $2, $3), ($2, $1, NULL) ON CONFLICT("user", "contact") DO NOTHING RETURNING id; 如果没有冲突,则返回如下所示的内容: ———- | id | ———- 1 | 50 | ———- 2 | 51 | ———- 但是如果有冲突,它不会返回任何行: ———- | id | ———- 我想返回新的id列,如果没有冲突或返回冲突列的现有id列。 可以这样做吗? 如果是这样, 怎么样?

SQL Server 2005中的Atomic UPSERT

在SQL Server 2005中,执行一个primefaces“UPSERT”(UPDATE where exists,INSERT otherwise)的正确模式是什么? 我看到很多代码(例如,请参阅检查一行是否存在,否则插入 )与以下两部分模式: UPDATE … FROM … WHERE <condition> — race condition risk here IF @@ROWCOUNT = 0 INSERT … 要么 IF (SELECT COUNT(*) FROM … WHERE <condition>) = 0 — race condition risk here INSERT … ELSE UPDATE … 其中<条件>将是对自然键的评估。 上述方法都不能很好地处理并发。 如果我不能有两个具有相同的自然键的行,看起来像所有的上述风险插入行在竞争条件情况下具有相同的自然键。 我一直在使用下面的方法,但我很惊讶,不能在人们的回答中看到它,所以我想知道它有什么问题: INSERT INTO <table> SELECT <natural keys>, […]

SQL Server中单行MERGE / upsert的语法

我试图做一个表单插入/更新,但所有的例子是有集。 任何人都可以修复我的语法: MERGE member_topic ON mt_member = 0 AND mt_topic = 110 WHEN MATCHED THEN UPDATE SET mt_notes = 'test' WHEN NOT MATCHED THEN INSERT (mt_member, mt_topic, mt_notes) VALUES (0, 110, 'test') 每个marc_s的解决scheme是将单行转换为子查询 – 这让我觉得MERGE命令并不是真正用于单行的upserts。 MERGE member_topic USING (SELECT 0 mt_member, 110 mt_topic) as source ON member_topic.mt_member = source.mt_member AND member_topic.mt_topic = source.mt_topic WHEN MATCHED […]

SQLite UPSERT /更新或插入

我需要对SQLite数据库执行UPSERT / INSERT OR UPDATE。 INSERT OR REPLACE命令在很多情况下是有用的。 但是,如果你想保留你的id与autoincrement适当的地方由于外键,它不起作用,因为它删除行,创build一个新的,因此这个新行有一个新的ID。 这将是表格: 玩家 – (主键在ID,用户名唯一) | id | user_name | age | —————————— | 1982 | johnny | 23 | | 1983 | steven | 29 | | 1984 | pepee | 40 |

SQLite插入 – 在重复密钥更新

MySQL有这样的东西: INSERT INTO visits (ip, hits) VALUES ('127.0.0.1', 1) ON DUPLICATE KEY UPDATE hits = hits + 1; 据我所知这个function在SQLite中不存在,我想知道的是,如果有任何方法来归档相同的效果,而不必执行两个查询。 另外,如果这是不可能的,你更喜欢什么: SELECT +(INSERT或UPDATE)或 更新(+ INSERT 如果更新失败 )

如何更新表中的一行或插入它,如果它不存在?

我有下面的表格: CREATE TABLE cache ( key text PRIMARY KEY, generation int ); 我想递增其中一个计数器,或者如果相应的行不存在,则将其设置为零。 有没有办法做到这一点没有并发问题在标准的SQL? 操作有时是交易的一部分,有时是分开的。 如果可能,SQL必须在SQLite,PostgreSQL和MySQL上未修改。 search产生了一些想法,这些想法可能会遇到并发问题,或者特定于数据库: 尝试INSERT一个新行,并UPDATE是否有错误。 不幸的是, INSERT上的错误会中止当前事务。 UPDATE该行,如果没有行被修改,则INSERT一个新行。 MySQL有一个ON DUPLICATE KEY UPDATE子句。 编辑:感谢所有伟大的答复。 看起来保罗是对的,而且没有一种便携式的方法可以做到这一点。 这对我来说是相当惊人的,因为这听起来像是一个非常基本的操作。

在SQL Server中插入更新存储过程

我已经写了一个存储过程,如果存在一个logging将做更新,否则将做一个插入。 它看起来像这样: update myTable set Col1=@col1, Col2=@col2 where ID=@ID if @@rowcount = 0 insert into myTable (Col1, Col2) values (@col1, @col2) 我这样写它的逻辑是,更新将使用where子句执行隐式select,如果返回0则插入将发生。 这样做的替代方法是做一个select,然后根据返回的行数进行更新或插入。 这是我认为效率低下,因为如果你要更新它会导致2select(第一个显式select调用,第二个隐含在更新的位置)。 如果proc做插入,那么效率就不会有差别。 我的逻辑在这里发声吗? 这是如何将一个插入和更新结合到一个存储过程?

插入MS访问

我需要为MS-Access 2000编写一个SQL查询,以便一行更新(如果存在),但如果不存在则插入。 (我相信这被称为“upsert”) 即 如果行存在… UPDATE Table1 SET (…) WHERE Column1='SomeValue' 如果它不存在… INSERT INTO Table1 VALUES (…) 这可以在一个查询中完成吗?