【问题标题】:INSERT INTO with SELECT .... what if SELECT returns 0 rowsINSERT INTO with SELECT .... 如果 SELECT 返回 0 行怎么办
【发布时间】:2017-07-27 15:37:01
【问题描述】:

我有一个存储过程,代码如下:

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 是参数

插入部分工作正常。将参数“文件名”中提供的文件扩展名与表 vtmd 中的文件扩展名列表进行比较。 只要文件扩展名存在于 vtmd 中,这也可以正常工作。

如果不是,它应该得到一个默认值 16 -> COALESCE(vtmd.ID,16) 但这不会发生。由于 SELECT 未找到/返回任何行,因此该过程完成且没有任何错误并且未进行任何插入。

我能做什么?

PS:别名是为了便于阅读。

更新

SELECT 返回一个空结果。在这种情况下,我想将 16 作为默认值返回。

【问题讨论】:

  • 只运行select语句,你会看到它是否返回数据
  • 您是否尝试过只运行SELECT 而没有INSERT?我很确定它什么也没返回。

标签: mysql sql


【解决方案1】:

如果您的 SELECT 没有返回任何行,则 INSERT 没有任何内容。拥有 COALESCE 不会强制插入,因为 SELECT 没有行,即使您为所有列指定了 COALESCE,如果您的 SELECT 没有返回任何行,这也不会插入任何内容。

返回的行中的空值与根本没有行之间存在差异。

【讨论】:

    【解决方案2】:

    这行得通:

    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
    1. 将 SELECT 作为变量处理(在我的例子中为 @XDateiTypID)。
    2. 如果变量保持 NULL,它将被使用 COALESCE 和默认值(在我的例子中为 16)覆盖。
    3. 之后,只需使用 VALUES 部分中的变量即可。

    PS:BEGIN .. END needed 因为它是一个存储过程。

    【讨论】:

      猜你喜欢
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2016-08-12
      相关资源
      最近更新 更多