mysql - 嵌套游标循环: Column count doesn't match value count at row 1

标签 mysql loops cursor nested nested-loops

这是我第一次在 MySQL 中处理游标和过程。我已按照 MySQL documentation on cursors 中给出的示例进行操作和 roseindia.net现在遇到错误:

Column count doesn't match value count at row 1

以下是涉及的表(这些表尚未标准化为 3NF,因为我收到的表是这样的,是的,我确实意识到我需要使用 arts.id 而不是 Artists.name):

CREATE TABLE `user_artists_rankings` (
  `user_id` varchar(50) NOT NULL DEFAULT '' COMMENT 'kpop_users.user_id',
  `artist_name` varchar(100) NOT NULL,
  `calculated_score` int(11) DEFAULT NULL,
  `last_calculated_score_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`,`artist_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `kpop_users` (
  `user_id` char(50) NOT NULL,
  `username` char(150) DEFAULT '',
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`) USING BTREE,
  KEY `name_idx` (`username`),
  KEY `twitter_id_idx` (`twitter_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
CREATE TABLE `artists` (
  `name` varchar(100) NOT NULL,
  `type` varchar(45) DEFAULT NULL,
  `official_twitter_screenname` varchar(45) DEFAULT NULL,
  `thumbnail_url` varchar(500) DEFAULT NULL,
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  KEY `Index_2` (`official_twitter_screenname`)
) ENGINE=InnoDB AUTO_INCREMENT=164 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

目标是在表中包含 user-artist(n) 行,user_artists_rankings,即:

user1 | artist1
user1 | artist2
user1 | artist3
user2 | artist1
user2 | artist2
user2 | artist3

这是我创建的过程:

delimiter ;
drop procedure if exists testrun;
delimiter //
create procedure testrun()
begin
    declare d int default 0;
    declare user_id varchar(50);
    declare artist_name varchar(100);
    declare cur_users cursor for select user_id from kpop_users;
    declare cur_artists cursor for select name from artists;
    declare continue handler for sqlstate '02000' set d=1;
    declare continue handler for sqlstate '23000' set d=1;
    open cur_users;
    open cur_artists;
    lbl1: loop 
        if d=1 then 
            leave lbl1;
        end if;
        if not d=1 then
            fetch cur_users into user_id;
            lbl2: loop
                if d=1 then
                    leave lbl2;
                end if;
                if not d=1 then
                    fetch cur_artists into artist_name;
                    insert into user_artists_rankings values (user_id, artist_name);
                end if;
            end loop lbl2;
        end if;
    end loop lbl1;
    close cur_users;
    close cur_artists;
end
//
delimiter ;
call testrun();

任何帮助将不胜感激。 谢谢。

最佳答案

这行代码是错误的:

insert into user_artists_rankings values (user_id, artist_name);

由于该表有 4 个字段,而您仅使用其中两个字段进行 INSERT,因此您需要指定使用哪些字段。应该是:

insert into user_artists_rankings(`user_id`, `artist_name`) VALUES(user_id, artist_name);

关于mysql - 嵌套游标循环: Column count doesn't match value count at row 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12339064/

相关文章:

mysql - XML 数据插入 MySql DB

mysql - SQL - 如何获取单元格的特定值?

c++ - 平均值计算不正确

Java - 在 for 循环中使用 "continue"时出现未处理的异常错误?

python - 迭代带有列表的字典以创建 n 个子图

vba - 循环遍历行以将值均匀地拆分到新的电子表格中

oracle - 如何在没有自定义类型或游标的情况下从 Oracle 函数返回表?

sql - 如何通过保留其他值复制旧数据并将新重命名的数据插入回同一个表

c++ - 如何启动将由 mysql_commit() 提交的 MySQL 事务

jQuery 焦点有时最终会使闪烁的文本光标消失