如果符合条件,是否可以插入新行?
例如,我有这个表没有主键也没有唯一性
+----------+--------+
| image_id | tag_id |
+----------+--------+
| 39 | 8 |
| 8 | 39 |
| 5 | 11 |
+----------+--------+
Run Code Online (Sandbox Code Playgroud)
如果例如image_id和tag_id的组合不存在,我想插入一行;
INSERT ..... WHERE image_id!=39 AND tag_id!=8
Run Code Online (Sandbox Code Playgroud)
我想你在说:你需要避免在这个表中重复的行.
有很多方法可以解决这个问题.最简单的一个:
INSERT INTO theTable (image_id, tag_id) VALUES (39, 8)
WHERE NOT EXISTS
(SELECT * FROM theTable
WHERE image_id = 39 AND tag_id = 8)
Run Code Online (Sandbox Code Playgroud)
正如@Henrik Opel指出的那样,你可以在组合列上使用检查约束,但是你必须在其他地方有一个try/catch块,这会增加不相关的复杂性.
编辑解释该评论......
我假设这是一张映射电影和标签之间多对多关系的表格.我意识到你可能正在使用php,但我希望下面的C#伪代码足够清晰.
如果我有一个Movie类,添加标记最自然的方法是一种AddTag()方法:
class Movie
{
public void AddTag(string tagname)
{
Tag mytag = new Tag(tagname); // creates new tag if needed
JoinMovieToTag(this.id, mytag.id);
}
private void JoinMovieToTag(movie_id, tag_id)
{
/* database code to insert record into MovieTags goes here */
/* db connection happens here */
SqlCommand sqlCmd = new SqlCommand("INSERT INTO theTable... /* etc */");
/* if you have a check constraint on Movie/Tag, this will
throw an exception if the row already exists */
cmd.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
在此过程中,没有切实可行的方法来检查重复项,因为其他用户可能随时标记电影,因此无法解决此问题.
注意:如果尝试插入欺骗记录意味着存在错误,那么抛出错误是合适的,但如果没有,则不希望错误处理程序中出现额外的复杂性.
| 归档时间: |
|
| 查看次数: |
6460 次 |
| 最近记录: |