如何在具有外键约束的情况下从2个表插入到1个表中进行选择...

时间:2019-06-17 18:57:28

标签: mysql mariadb

我有一个全新的表,我试图将数据复制到2个不同的表中。所有数据都是必需的,因此必须位于同一插入语句中。数据之一只是查找表中的外键。这两个原始表彼此无关,因为其中一个是链接到该新表的全新表。

我在将插入内容插入…select语句时遇到问题,可能需要一些帮助。我提出的以下查询在语法上是正确的,但出现错误。

insert into destination_table (fk_name_id, name, description, cycle_time, hand_offs, touch_time, fk_origin_id)
values ((select id from lookup_table where name = 'some name'), 
        (select ot.name, ot.description, ot.ctroi, ot.horoi, ot.ttroi, tc.id
         from origin_table ot
         left join table_a ta on ot.taid = ta.id
         left join table b tb on ta.tbid = tb.id
         left join table_c tc on tb.tcid = tc.id));

我得到的错误是:

ERROR 1241 (21000): Operand should contain 1 column(s)

我已经研究了几天,一直在寻找Stack Overflow和各种搜索引擎,但是没有看到这个特定的问题。

我能想到的唯一解决方法是单独进行查找表搜索,我无法获得WITH子句来处理插入,然后将其硬编码到插入中。但是,我真的不想这样做,因为它最终将在不同的环境中运行,并且首选动态方式。

2 个答案:

答案 0 :(得分:1)

使用INSERT INTO...VALUES代替INSERT INTO...SELECT

insert into destination_table (fk_name_id, name, description, cycle_time, hand_offs, touch_time, fk_origin_id)
select 
  (select id from lookup_table where name = 'some name'), 
  ot.name, ot.description, ot.ctroi, ot.horoi, ot.ttroi, tc.id
  from origin_table ot
  left join table_a ta on ot.taid = ta.id
  left join table b tb on ta.tbid = tb.id
  left join table_c tc on tb.tcid = tc.id;

答案 1 :(得分:0)

您可以使用交叉联接

insert into destination_table (
  fk_name_id
  , name
  , description
  , cycle_time
  , hand_offs
  , touch_time
  , fk_origin_id)
values ( 
    select t2.id, t1.* from 
    (select ot.name, ot.description, ot.ctroi, ot.horoi, ot.ttroi, tc.id
     from origin_table ot
     left join table_a ta on ot.taid = ta.id
     left join table b tb on ta.tbid = tb.id
     left join table_c tc on tb.tcid = tc.id) t1
     cross  join  ( select id 
      from lookup_table 
      where name = 'some name') t2 
  );