我正在收集来自数千个传感器的读数并将它们存储在 MySQL 数据库中。每秒有数百次插入。为了提高插入性能,我最初将值存储到 MEMORY 缓冲表中。我每分钟运行一次存储过程,将插入的行从内存缓冲区移动到永久表。
基本上我想在我的存储过程中执行以下操作以从临时缓冲区移动行:
INSERT INTO data SELECT * FROM data_buffer;
DELETE FROM data_buffer;
不幸的是,前一个不可用,因为数据收集过程在上面的 INSERT 和 DELETE 之间的“data_buffer”中插入了额外的行。因此,这些行将被删除而不会插入到“数据”表中。
如何使操作成为原子操作或使 DELETE 语句只删除在前面的语句中被选择和插入的行?
如果可能的话,我更愿意以一种适用于不同数据库引擎的标准方式来执行此操作。
由于性能开销和存储要求,我不希望添加任何额外的“id”列。
我希望在标准 SQL 或类似的东西中有 SELECT_AND_DELETE 或 MOVE 语句...
最佳答案
我相信这会起作用,但会阻塞直到插入完成
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
INSERT INTO data (SELECT * FROM data_buffer FOR UPDATE);
DELETE FROM data_buffer;
COMMIT TRANSACTION;
关于mysql - 如何以原子方式将行从一个表移动到另一个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6925739/