如何在mysql存储过程中使用insert ignore

时间:2013-10-28 08:11:36

标签: mysql stored-procedures insert

我希望有一个错误陷阱,如果数据已经存在,那么数据将不会插入到表中。我有这个代码,但它不起作用。

 INSERT IGNORE INTO staging_table (playlist_id,terminal_id,userid) VALUES
(
 (SELECT playlist_id FROM playlist_terminal WHERE playlist_id = i_playlistid),
 (SELECT terminal_id FROM playlist_terminal WHERE playlist_id = i_playlistid),
 (SELECT userid FROM playlist_terminal WHERE playlist_id = i_playlistid)
);

1 个答案:

答案 0 :(得分:0)

正如INSERT Syntax所述:

  

如果使用IGNORE关键字,则会忽略执行INSERT语句时发生的错误。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将中止。使用IGNORE时,仍未插入行,但不会发生错误。忽略错误可能会生成警告,但重复键错误不会。

因此,您必须在任何列确定记录是否“已存在”时定义唯一性约束。例如,如果您只想拒绝所有三列匹配的记录:

ALTER TABLE staging_table ADD UNIQUE KEY (playlist_id, terminal_id, userid);

此外,不是INSERT IGNORE,而是将INSERT ... ON DUPLICATE KEY UPDATEUPDATE子句一起使用不会改变任何内容(因为这只会忽略重复的键错误并避免忽略任何内容)。其他形式的错误 - 请参阅“INSERT IGNORE” vs “INSERT … ON DUPLICATE KEY UPDATE”)。

您还可以使用INSERT ... SELECT

简化INSERT声明
INSERT INTO staging_table
  (playlist_id, terminal_id, userid)
    SELECT playlist_id, terminal_id, userid
    FROM   playlist_terminal
    WHERE  playlist_id = i_playlistid
ON DUPLICATE KEY UPDATE
  playlist_id = playlist_id
;