我有3张桌子
series
Id, Series_Id, Name, etc
genres
Id, Name
series_genre
Series_Id, Genre_Id
现在我的问题是我想使用系列和流派的唯一标识符来存储系列'genre in series_genre,比如
INSERT INTO series_genre (Series_Id, Genre_Id) VALUES (1, 13)
现在我希望能够只在行尚不存在的情况下添加新行(以防止重复)。我尝试在一个查询中执行此操作,但无法弄明白,因为一个系列应该能够进行多个类型分配,因此series_Ind和Series_genre中的Genre_Id不能是唯一标识符。
总而言之,我的问题是:如果只在一个查询中存在具有相同值的行,则只插入一行!?提前谢谢!
答案 0 :(得分:1)
首先,让数据库验证数据,因此创建一个唯一约束/索引:
CREATE UNIQUE INDEX unq_series_genre_2 ON series_genre(series_id, genre_id);
然后忽略重复项,我建议ON DUPLICATE KEY UPDATE
:
INSERT INTO series_genre (Series_Id, Genre_Id)
VALUES (1, 13)
ON DUPLICATE KEY UPDATE Series_Id = VALUES(Series_Id);
为什么我比INSERT IGNORE
更喜欢这个?有两个原因。首先,没有性能损失,因为记录实际上没有改变。 (当更新不更改数据时,这非常重要,并非在所有数据库中都是如此。)
其次,这只会在发生唯一密钥违规时忽略错误。 INSERT IGNORE
可以忽略您可能想要捕获的其他错误。
答案 1 :(得分:0)
INSERT ... SELECT
可能会在这里解决。
<强>查询强>
INSERT INTO series_genre (Series_Id, Genre_Id)
SELECT
1, 13
FROM
DAUL
WHERE NOT EXISTS (
SELECT
1
FROM
series_genre
WHERE
Series_Id = 1
AND
Genre_Id = 13
)