2013-07-21 33 views
13

Bir otomatik artış birincil anahtar içeren bir tablo:MySQL otomatik artış ile tabloya eklemek

:

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) 
); 

başka tablonun kısım Bu tablo doldurmak isteyen

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; 

Birincil anahtardan dolayı (ki bu otomatik olarak artırılmış bir değerdir ve dolayısıyla ayarlanması gerekmez), sütunların eşleşmediğini söyleyen bir hata alıyorum. Bunu nasıl halledebilirim?

cevap

20
Açıkça insert açıklamada sütunları listelemek gerekir

: genellikle

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; 

Bu: Ayrıca

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; 

, bunu açık ziyade iç içe seçer daha katılır kullanmak daha form olduğunu düşünüyorum (ancak her zaman değil), optimize edicinin en iyi sorgu planını bulmasına yardımcı olur.

12

Eklenti sırasında birincil anahtarı NULL olarak ayarlamanız yeterlidir.

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 ; 
İlgili konular