2

我正在尝试使用从一个数据库中的表到另一个数据库中的表的字段列表进行简单的插入。

insert into db_a.target_table (field1,field2,field3) select field1,field2,field3 from db_b.source_table; 

错误消息似乎直截了当..

MemSQL 不支持这种类型的查询:Cross-database INSERT ... SELECT

奇怪的是,这个例子确实有效:

insert into db_a.target_table select * from db_b.source_table;

但这似乎是一种常见的情况。有没有人遇到过类似的问题,你能解决它吗?

4

1 回答 1

0

不幸的是,这是不允许的,因为这样的查询很难保持事务性;内部使用多语句事务来保证单个插入选择的事务性(如果一个分区失败(dup key 或其他东西),我们想要回滚所有内容!)。由于我们没有跨数据库多语句事务(还没有!),我们没有跨数据库插入选择(还没有!)。

请继续关注更好的解决方案。

但是,如果您真的想这样做,这就是您要做的。然而,

继续需要您自担风险。这不是一个受支持的程序。

但它应该工作。

1) 在 上db_b,创建一个与 具有相同列的表source_table,但制作 shard key SHARD()

2)在db_a,运行SHOW PARTITIONS

db_a_<ordinal>3) 对于每个分区,在列出的主机和端口上创建一个连接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或执行任何您想要的操作。

祝你好运!

于 2015-09-16T15:11:18.107 回答