如何调试:子查询返回多于1行

时间:2018-06-27 11:34:35

标签: mysql

我正在将CSV数据加载到mysql中,并将一列中的值替换为另一个现有表中的相应值。

我正在使用一个子查询来执行此操作,该子查询应该总是返回一个值,但是事实证明该表没有被引用的列是唯一的。并且在被引用列上具有重复的值会使子查询返回多个值,这是可以理解的。

无论如何,有没有告诉MySql关于加载时发生错误的哪行触发了此错误?或以任何方式调试此问题?

我想在当前表中找到引用具有重复列的行的行,因此我将能够手动检查每个重复项,以确保引用了第一个表中的正确数据。

示例SQL

LOAD DATA
LOCAL INFILE 'file.csv'
REPLACE INTO
TABLE `db`.`table`
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
#ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(
 @old_value
)
SET
`column` = (
    SELECT new_column from `db`.`other_table`
    where old_column = @old_value
);

2 个答案:

答案 0 :(得分:1)

  

是否有必要告诉MySql关于加载时发生错误的哪一行触发此错误?

我不知道。

  

或以任何方式调试此问题?

查看添加到“ db.table”的最后一条记录,在您的数据文件中找到该记录。引起问题的记录是下一个。

但这实际上并不能解决您的问题-显然您尚未将db.other_table.old_column定义为唯一,并且您的插入触发器不会处理多个记录。

由于我们对您的数据模型一无所知,因此我们无法真正建议您需要解决其中的哪些问题-但这里有一些答案,说明如何在MySQL数据库中查找重复项。

答案 1 :(得分:0)

我建议仅执行LOAD DATA语句,然后进行单独的真实更新以映射值:

UPDATE `db`.`table` t1
INNER JOIN `db`.`other_table` t2
    ON t1.`column` = t2.old_column
SET t1.`column` = t2.new_value;