仅使用mysql插入一次行(在一个查询中)

时间:2018-02-17 12:32:43

标签: php mysql sql

我有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不能是唯一标识符。

总而言之,我的问题是:如果只在一个查询中存在具有相同值的行,则只插入一行!?提前谢谢!

2 个答案:

答案 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   
)