Я думаю вы говорите: вам нужно избегать повторяющихся строк в этой таблице.
Есть много способов справиться с этим. Один из самых простых:
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 где-то еще, что добавляет ненужную сложность.
Редактировать , чтобы объяснить этот комментарий ...
Я предполагаю, что это таблица, отображающая отношения «многие ко многим» между фильмами и тегами. Я понимаю, что вы, вероятно, используете 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();
}
}
Нет практического способа проверить дубликаты на более ранних этапах процесса, потому что другой пользователь может пометить фильм в любой момент, поэтому нет способа обойти это.
Примечание: Если попытка вставить запись дублирования означает, что есть ошибка, тогда выдается ошибка, но если нет, вам не нужны дополнительные сложности в обработчике ошибок.