我尝试使用字段列表从一个数据库中的表到另一个数据库中的表进行简单插入。
insert into db_a.target_table (field1,field2,field3) select field1,field2,field3 from db_b.source_table;
错误信息似乎很简单..
MemSQL不支持这种类型的查询:跨数据库INSERT ... SELECT
奇怪的是,这个例子确实有效:
insert into db_a.target_table select * from db_b.source_table;
但这似乎是一种常见的情况。有没有人遇到类似的问题,你能解决它吗?
答案 0 :(得分:0)
不幸的是,这是不允许的,因为很难保持这样的查询交易;内部使用多语句事务来保证单个insert-select的事务性(如果一个分区失败(dup键或其他),我们想要回滚所有内容!)。由于我们没有交叉数据库多语句事务(还没有!),我们没有交叉数据库插入选择(还有!)。
请继续关注更好的解决方案。
然而,如果你想要这样做,那么你就是这样做的。然而,
自行承担风险。这不是一个支持的程序。
但它应该有效。
1)在db_b
上,创建一个与source_table
具有相同列的表格,但创建分片键SHARD()
。
2)在db_a
上,运行SHOW PARTITIONS
。
3)对于每个分区,在db_a_<ordinal>
中列出的主机和端口上创建与SHOW PARTITIONS
的连接。在该连接上运行SHOW DATABASES
,您将看到一些名为db_b_<another>
的数据库。选择一个,并不重要。运行INSERT INTO db_b<another>.source_table SELECT * from db_a_<ordinal>.source_table
。
3.5)此时,你还没有写到你关心的桌子,但现在我们会。看db_b.source_table
。一切都正确吗?那里有所有数据吗?运行SHOW CREATE TABLE
并仔细检查分片键是SHARD KEY ()
(它应该在注释中)。一切都很好看?好的,我们可以继续。
4)在为每个分区完成此操作后,您可以执行INSERT INTO db_b.target_table (cols) SELECT cols from db_b.source_table
或任何您想要的操作。