MySQL - 从临时表中插入INTO

时间:2014-07-14 16:48:42

标签: mysql sql sql-insert mysql-error-1064 temporary

这看起来很容易,但是我只是简单地插入了一个声明。见下文:

begin work;
CREATE TEMPORARY TABLE IF NOT EXISTS insert_table AS 
(
select
     r.resource_id
    ,fr.file_repos_id
    ,mv.VALUE

from
         resources r
   join  versions v on v.RESOURCE_ID = r.resource_id
   join  metadata_values mv on mv.resource_id = r.resource_id
   join  file_repository fr on fr.file_repos_id = v.foreign_id

where  
        v.version_status = 'C'
    and r.RESOURCE_TYPE = 4
    and fr.file_title in ('suburbs')
);


insert 
    into 
        metadata_values (elem_id,value,resource_type,resource_id,foreign_id,mtvr_id,mett_id) 
    values
        (62,'test',4,insert_table.resource_id,insert_table.file_repos_id,80,4);

rollback work;

在临时表行fr.file_title in ('suburbs')中,实际列表是从其他地方动态提取的(这是出于演示目的)。我收到以下错误消息:

错误代码:1054。未知列' insert_table.resource_id'在'字段列表'

现在,我可以在临时表中运行一个select,它返回正常,它只是在update语句中失败了。我是从MySQL工作台运行的。完全不知道这里发生了什么。

2 个答案:

答案 0 :(得分:4)

您想要insert . . . select

insert into  metadata_values(elem_id,value, resource_type, resource_id, foreign_id,
                             mtvr_id, mett_id
                            ) 
    select 62, 'test', 4, insert_table.resource_id, insert_table.file_repos_id, 80, 4
    from insert_table;

答案 1 :(得分:1)

使用insert_table.column_name不会自动使用该表。要做到这一点,你需要使用变量或select语句。

我认为您正在寻找的是以下内容,但如果它们存在于insert_table中,它将插入elem_id 62的多行。实际上,这将插入具有相同elem_id,value,mtvr_id和met_id的N行,其中N是insert_table中的行数。

insert     into 
    metadata_values (elem_id,value,resource_type,resource_id,foreign_id,mtvr_id,mett_id) 
values
    Select    
        62,'test',4,insert_table.resource_id,insert_table.file_repos_id,80,4
    From    insert_table

您可以通过完全跳过临时表来节省内存开销。

 insert     into 
    metadata_values (elem_id,value,resource_type,resource_id,foreign_id,mtvr_id,mett_id) 
values
     Select    
        62,mv.VALUE,4,r.resource_id,fr.file_repos_id,80,4
    From    resources r
    join  versions v on v.RESOURCE_ID = r.resource_id
    join  metadata_values mv on mv.resource_id = r.resource_id
    join  file_repository fr on fr.file_repos_id = v.foreign_id

 where  
         v.version_status = 'C'
     and r.RESOURCE_TYPE = 4
     and fr.file_title in ('suburbs')