【问题标题】:MemSQL - why can't I do a cross-database insert into .. selectMemSQL - 为什么我不能将跨数据库插入到 .. select
【发布时间】:2015-12-13 00:41:03
【问题描述】:

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

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;

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

【问题讨论】:

    标签: singlestore


    【解决方案1】:

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

    敬请期待更好的解决方案。

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

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

    但它应该工作。

    1) 在db_b 上,创建一个与source_table 具有相同列的表,但将分片键设为SHARD()

    2) 在db_a 上,运行SHOW PARTITIONS

    3) 对于每个分区,在SHOW PARTITIONS 中列出的主机和端口上创建到db_a_<ordinal> 的连接。在该连接上运行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 ()(它应该在cmets 中)。一切看起来都不错?好的,我们可以继续。

    4) 为每个分区完成此操作后,您可以执行INSERT INTO db_b.target_table (cols) SELECT cols from db_b.source_table 或任何您想要的操作。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 2016-08-05
      • 2021-12-16
      • 2013-05-04
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多