views:

223

answers:

6

hi i tried to use the following query to insert data in a table nd got error

insert into filmo_person_song (person_id, song_id, role_id)
select person_id
from filmo_person_song fps, filmo_song fs, filmo_role fr
where fps.song_id = fs.song_id
  and fps.role_id = fr.role_id
  and fps.person_id = 43629;

ERROR 1136 (21S01): Column count doesn't match value count at row 1

i have specified the fields exactly..

+2  A: 

You are trying to insert one value in each row, but you have specified three columns to be written to:

insert into filmo_person_song (person_id, song_id, role_id)
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^
select person_id
       ^^^^^^^^^

You will need to list values for all of the three columns in your select statement. The following might work:

insert into filmo_person_song (person_id, song_id, role_id)
select fps.person_id, fs.song_id, fr.role_id
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Jørn Schou-Rode
+1  A: 

You are only selecting person_id from the subquery, whereas you specified person_id, song_id and role_id in the insert clause. You must select also the missing fields in the subquery.

You probably want something like this:

INSERT INTO
    filmo_person_song (person_id, song_id, role_id)
SELECT
    person_id,
    song_id,
    role_id
FROM 
    filmo_person_song fps, filmo_song fs, filmo_role fr
WHERE
    fps.song_id = fs.song_id
AND
    fps.role_id = fr.role_id
AND
   fps.person_id = 43629;
Tatu Ulmanen
+1  A: 

you're just specifying one field ( select person_id ) to insert into the table, while the column specifications state that person_id, sond_id and role_id will be inserted.

this should work better:

insert into filmo_person_song (person_id, song_id, role_id)
select person_id, fs.song_id, fr.role_id
from filmo_person_song fps, filmo_song fs, filmo_role fr
where fps.song_id = fs.song_id
  and fps.role_id = fr.role_id
  and fps.person_id = 43629;
David Hedlund
+1  A: 

Change it to:

insert into filmo_person_song (person_id, song_id, role_id)
select person_id, fs.song_id, fr.role_id
from filmo_person_song fps, filmo_song fs, filmo_role fr
where fps.song_id = fs.song_id
  and fps.role_id = fr.role_id
  and fps.person_id = 43629;
Jimmy Shelter
+1  A: 

Subery return values must match with insert query as below.


insert into filmo_person_song (person_id, song_id, role_id) 
select person_id, song_id, role_id 
from filmo_person_song fps, filmo_song fs, filmo_role fr 
where fps.song_id = fs.song_id 
  and fps.role_id = fr.role_id 
  and fps.person_id = 43629; 
valli
+1  A: 

Hi

You are asking it to add values for 3 columns (person_id, song_id, role_id), but are only supplying 1:

person_id

Try:

insert into filmo_person_song (person_id)
values (select person_id
from filmo_person_song fps, filmo_song fs, filmo_role fr
where fps.song_id = fs.song_id
  and fps.role_id = fr.role_id
  and fps.person_id = 43629);

or:

insert into filmo_person_song (person_id, song_id, role_id)
values (
select person_id, song_id, role_id
from filmo_person_song fps, filmo_song fs, filmo_role fr
where fps.song_id = fs.song_id
  and fps.role_id = fr.role_id
  and fps.person_id = 43629);
toast38coza