我有一个包含以下代码的存储过程:
INSERT INTO vt_benutzer_medien_liste (`BenutzerID`, `ReportID`, `MedienDateiTypID`, `Dateiname`, `Dateidatum`, `Dateigroesse`, `Bemerkungen`)
SELECT UserID, ReportID, COALESCE(vtmd.ID,16), Filename, FileDate, FileSize, Message
FROM vt_medien_dateityp AS vtmd
WHERE vtmd.Dateiendung = SUBSTRING_INDEX(Filename,'.',-1)
LIMIT 1
UserID,ReportID,Filename,FileDate,FileSize和Message是参数
插入部分工作正常。将参数“Filename”中提供的fileextension与表vtmd中的fileextensions列表进行比较。 只要filettension存在于vtmd中,这也可以正常工作。
如果没有,它应该得到默认值16 - > COALESCE(vtmd.ID,16) 但这并没有发生。该过程完成没有任何错误,并且没有进行任何插入,因为SELECT查找/返回没有行。
我该怎么办?
PS:别名是为了便于阅读。
更新
SELECT返回一个空结果。我希望将16作为默认值返回。
答案 0 :(得分:2)
如果你的SELECT没有返回任何行,那么INSERT就没有了。由于SELECT没有行,因此COALESCE不会强制执行INSERT,即使您为所有列指定了COALESCE,如果没有从SELECT返回任何行,也不会插入任何内容。
返回行中的空值与根本没有行之间存在差异。
答案 1 :(得分:1)
这有效:
BEGIN
SELECT @XDateiTypID := COALESCE((SELECT ID FROM vt_medien_dateityp WHERE Dateiendung = SUBSTRING_INDEX(Filename,'.',-1) LIMIT 1),16);
INSERT INTO vt_benutzer_medien_liste (`BenutzerID`, `ReportID`, `MedienDateiTypID`, `Dateiname`, `Dateidatum`, `Dateigroesse`, `Bemerkungen`)
VALUES (UserID, ReportID, @XDateiTypID, Filename, FileDate, FileSize, Message);
END
PS:BEGIN .. END needed因为它是一个存储过程。