gpt4 book ai didi

SQL 条件行插入

转载 作者:可可西里 更新时间:2023-11-01 07:24:10 24 4
gpt4 key购买 nike

是否可以在满足条件时插入新行?

例如,我有一张没有主键也没有唯一性的表

    +----------+--------+
| image_id | tag_id |
+----------+--------+
| 39 | 8 |
| 8 | 39 |
| 5 | 11 |
+----------+--------+

如果 image_id 和 tag_id 的组合不存在,我想插入一行例如;

INSERT ..... WHERE image_id!=39 AND tag_id!=8

最佳答案

认为您是在说:您需要避免此表中的重复行。

有很多方法可以处理这个问题。最简单的一种:

INSERT INTO theTable (image_id, tag_id) VALUES (39, 8)
WHERE NOT EXISTS
(SELECT * FROM theTable
WHERE image_id = 39 AND tag_id = 8)

正如@Henrik Opel 指出的那样,您可以在组合列上使用检查约束,但随后您必须在其他地方使用 try/catch block ,这会增加不相关的复杂性。

编辑以解释该评论...

我假设这是一个映射电影和标签之间多对多关系的表。我知道您可能正在使用 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();
}
}

没有实用的方法来在此过程的早期检查重复项,因为另一个用户可能随时标记电影,所以没有办法解决这个问题。

注意:如果尝试插入重复记录意味着存在错误,则抛出错误是合适的,但如果不是,则您不希望错误处理程序变得额外复杂。

关于SQL 条件行插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2852935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com