【问题标题】:MySQL insert into table with auto-increment while selecting from another tableMySQL 在从另一个表中选择时插入到具有自动增量的表中
【发布时间】:2013-07-20 09:02:31
【问题描述】:

我有一个带有自增主键的表:

create table rt_table
(
  rtID int PRIMARY KEY AUTO_INCREMENT, 
  rt_user_id BIGINT,               /*user being retweeted*/
  rt_user_name varchar(70),        /*user name of rt_user_id*/
  source_user_id BIGINT,           /*user tweeting rt_user_id*/
  source_user_name varchar(70),    /*user name of source_user_id*/
  tweet_id BIGINT,                 /*fk to table tweets*/

  FOREIGN KEY (tweet_id) references tweets(tweet_id)
);

我希望从另一个表的部分填充此表:

insert into rt_table 
select rt_user_id, (select user_name from users u where u.user_id = t.rt_user_id),
       source_user_id, (select user_name from users u where u.user_id = t.source_user_id),
       tweet_id
  from tweets t
 where rt_user_id != -1;

我收到一个错误,指出列数不匹配,这是因为主键(这是一个自动递增的值,因此不需要设置)。我该如何解决这个问题?

【问题讨论】:

    标签: mysql select insert auto-increment


    【解决方案1】:

    您需要在insert 语句中明确列出列:

    insert into rt_table (rt_user_id, rt_user_name, source_user_id, source_user_name, tweet_id)
    select rt_user_id, (select user_name from users u where u.user_id = t.rt_user_id),
           source_user_id, (select user_name from users u where u.user_id = t.source_user_id),
           tweet_id
      from tweets t
     where rt_user_id != -1;
    

    另外,我认为使用显式连接比嵌套选择更好:

    insert into rt_table (rt_user_id, rt_user_name, source_user_id, source_user_name, tweet_id)
        select t.rt_user_id, u.user_name, t.source_user_id, su.user_name, t.tweet_id
        from tweets t left outer join
             users u
             on t.rt_user_id = u.user_id left outer join
             users su
             on t.source_user_id = su.user_id
        where rt_user_id != -1;
    

    这通常(但不总是)帮助优化器找到最佳查询计划。

    【讨论】:

      【解决方案2】:

      您只需在插入过程中将主键设置为NULL

      INSERT INTO rt_table 
      SELECT 
        NULL,
        rt_user_id,
        (SELECT 
          user_name 
        FROM
          users u 
        WHERE u.user_id = t.rt_user_id),
        source_user_id,
        (SELECT 
          user_name 
        FROM
          users u 
        WHERE u.user_id = t.source_user_id),
        tweet_id 
      FROM
        tweets t 
      WHERE rt_user_id != - 1 ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-07
        • 2019-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 2015-10-14
        • 1970-01-01
        相关资源
        最近更新 更多