SQL条件行插入

Pab*_*blo 4 mysql sql syntax

如果符合条件,是否可以插入新行?

例如,我有这个表没有主键也没有唯一性

    +----------+--------+
    | 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)

egr*_*nin 7

你在说:你需要避免在这个表中重复的行.

有很多方法可以解决这个问题.最简单的一个:

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)

在此过程中,没有切实可行的方法来检查重复项,因为其他用户可能随时标记电影,因此无法解决此问题.

注意:如果尝试插入欺骗记录意味着存在错误,那么抛出错误是合适的,但如果没有,则不希望错误处理程序中出现额外的复杂性.

  • 当我用WHERE NOT EXISTS语句运行这样的条件查询时mysql给我一个语法错误. (3认同)