小编Cla*_*key的帖子

如何原子替换PostgreSQL中的表数据

我想替换一个表的全部内容,而不影响过程中任何传入的SELECT语句。

用例是有一个表,用于存储定期提取的邮箱信息,并且需要存储在 PostgreSQL 表中。有许多客户端使用不断查询同一张表的应用程序。

通常,我会做类似(伪代码传入)...

BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
Run Code Online (Sandbox Code Playgroud)

但不幸的是,在此过程中无法读取该表;由于INSERT INTO完成需要时间。桌子被锁上了。

在 MySQL 中,我会使用他们的原子RENAME TABLE命令来避免这些问题......

CREATE TABLE table_new LIKE table; 
INSERT INTO table_new;
RENAME TABLE table TO table_old, table_new TO table; *atomic operation*
DROP TABLE table_old;
Run Code Online (Sandbox Code Playgroud)

我如何在 PostgreSQL 中实现这一点?

对于这个问题,您可以假设我没有使用外键。

postgresql

18
推荐指数
1
解决办法
2万
查看次数

在 MySQL 上的安全事务中截断和插入

我想TRUNCATEINSERT数据到MySQL的InnoDB表。

我想确保如果事务中的任何语句失败,数据都不会受到影响。

如果出现故障,我不能有一个空的或损坏的表。

这就是我打算这样做的方式。

  1. BEGIN TRANSACTION
  2. TRUNCATE TABLE table_name
  3. INSERT INTO table_name
  4. COMMIT

然后我了解到这TRUNCATE TABLE table_name 会导致隐式 COMMIT,这使得整个交易毫无意义。

然后我TRUNCATE TABLE table_name用一种DELETE FROM table_name方法替换了,这并不理想 - 但这也会导致隐式 COMMIT

DROP TABLE table_name并且CREATE TABLE table_name还会导致隐式 COMMIT!

什么方法/逻辑最适合执行我想要做的事情?

使用运行在 Windows Server 2008 R2 上的 MySQL 5.6.17 64 位服务器

mysql transaction truncate rollback

7
推荐指数
1
解决办法
8854
查看次数

标签 统计

mysql ×1

postgresql ×1

rollback ×1

transaction ×1

truncate ×1