我想替换一个表的全部内容,而不影响过程中任何传入的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 中实现这一点?
对于这个问题,您可以假设我没有使用外键。
我想TRUNCATE
和INSERT
数据到MySQL的InnoDB表。
我想确保如果事务中的任何语句失败,数据都不会受到影响。
如果出现故障,我不能有一个空的或损坏的表。
这就是我打算这样做的方式。
BEGIN TRANSACTION
TRUNCATE TABLE table_name
INSERT INTO table_name
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 位服务器