我希望有一个错误陷阱,如果数据已经存在,那么数据将不会插入到表中。我有这个代码,但它不起作用。
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)
);
答案 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 UPDATE
与UPDATE
子句一起使用不会改变任何内容(因为这只会忽略重复的键错误并避免忽略任何内容)。其他形式的错误 - 请参阅“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
;