mysql 带子查询插入查询

bsxbgnwa  于 12个月前  发布在  Mysql
关注(0)|答案(6)|浏览(114)

我尝试使用以下查询在表中插入数据,但出现错误

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;

错误1136(21S01):列计数与第1行的值计数不匹配
我已经指定了字段准确..

6qfn3psc

6qfn3psc1#

您试图在每行插入一个值,但您指定了要写入的三个列:

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

您需要在select语句中列出所有三列的值。以下方法可能有效:

insert into filmo_person_song (person_id, song_id, role_id)
select fps.person_id, fs.song_id, fr.role_id
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
jei2mxaa

jei2mxaa2#

您只是从子查询中选择了person_id,而在insert子句中指定了person_idsong_idrole_id。还必须选择子查询中缺少的字段。
你可能想要这样的东西:

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

r8uurelv3#

你只是指定一个字段(select person_id)插入到表中,而列规范规定person_idsond_id * 和 * role_id将被插入。
这应该会更好:

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

bqucvtff4#

将其更改为:

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

oogrdqng5#

您要求它为3列(person_id,song_id,role_id)添加值,但只提供1:
人员标识
试试看:

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

或:

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

bn31dyow6#

子查询返回值必须与插入查询匹配,如下所示。

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;

相关问题