2013-07-21 30 views
13

私は自動インクリメントの主キーを持つテーブルがあります。MySQLは自動インクリメントとテーブルに挿入

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; 

プライマリキー(自動インクリメントされた値であるため、設定する必要がないため)の数が一致しないというエラーが表示されます。これをどうやって回避するのですか?

答えて

20

あなたが明示的insert文で列をリストする必要があります。

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; 

しばしばこの:

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; 

また、私はむしろ、ネストされた選択よりも、参加する明示的な使用することをお勧め形だと思います(常にではありませんが)オプティマイザが最適なクエリプランを見つけるのに役立ちます。

12

挿入中に主キーを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 ; 
関連する問題