2013-07-21 13 views
13

Ich habe eine Tabelle mit einem Autoinkrement-Primärschlüssel:MySQL in Tabelle einfügen mit Autoinkrement, während aus einer anderen Tabelle Auswahl

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

Ich wünsche von Teilen einer anderen Tabelle, um diese Tabelle zu füllen:

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; 

Ich bekomme einen Fehler, der sagt, dass die Anzahl der Spalten nicht übereinstimmen, was wegen des Primärschlüssels ist (der ein automatisch inkrementierter Wert ist und daher nicht gesetzt werden muss). Wie komme ich hier zurecht?

Antwort

20

Sie müssen explizit die Spalten in der insert Anweisungsliste:

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; 

Auch ich denke, es ist besser Form ist explizit schließt sich zu verwenden, anstatt verschachtelte wählt:

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; 

Diese oft (aber nicht immer) hilft dem Optimierer, den besten Abfrageplan zu finden.

12

Sie setzen den Primärschlüssel während des Einfügens einfach auf 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 ; 
Verwandte Themen