0

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

 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)
);
4

1 回答 1

2

INSERT语法中所述:

如果使用关键字,则执行语句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”与“INSERT ... ON DUPLICATE KEY UPDATE ”</a>)。

您还可以INSERT使用以下方法简化您的陈述INSERT ... SELECT

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
;
于 2013-10-28T08:23:11.390 回答