ВСТАВЬТЕ, ЕСЛИ НЕ СУЩЕСТВУЕТ, со значением NULL

У меня есть две таблицы: теги и таблица ссылок photos_tags. Я хочу добавить новый тег, поэтому я проверяю, есть ли этот тег в таблице тегов, и если нет, то вставляю его. Мои таблицы выглядят примерно так: tags(id, name), photos_tags(photos_id, tags_id). Теперь я попытался сделать это с помощью:

IF NOT EXISTS (SELECT * FROM tags WHERE name=*tagsName*)  
  INSERT INTO tags VALUES (NULL, *tagsName*); --NULL used for autonumbering

Я также пробовал:

INSERT INTO tags (  
  SELECT NULL, *tagsName*  
  WHERE NOT EXISTS (  
    SELECT * FROM tags  
    WHERE name=*tagsName*  
  )  
);

Оба утверждения приводят к синтаксическим ошибкам:

  • в первом утверждении рядом с if
  • во втором утверждении рядом с select

Как должен выглядеть мой запрос?


person nme    schedule 02.06.2012    source источник
comment
Кстати, *tagsName* это недопустимо и должно выглядеть как 'tagsName'. Сначала я подумал, что ты просто так написал, но теперь я беспокоюсь, что ты ошибся.   -  person Andrius Naruševičius    schedule 03.06.2012
comment
В первом утверждении: рядом с IF: синтаксическая ошибка Во втором: рядом с SELECT: синтаксическая ошибка   -  person nme    schedule 03.06.2012
comment
не волнуйтесь, он заменен тегом \'+ +\'   -  person nme    schedule 03.06.2012
comment
Разве ваши строки не должны быть завернуты в одиночные тики? 'tagsName' вместо tagsname   -  person user1166147    schedule 03.06.2012
comment
на самом деле они есть, но в sqlite (в С++) запрос представляет собой строку   -  person nme    schedule 03.06.2012


Ответы (2)


Создайте ограничение UNIQUE для tags.name и используйте это:

INSERT  OR IGNORE
INTO    tags (id, name)
VALUES  (NULL, 'tagsName')

Если по какой-то причине вы не можете или не хотите этого делать, используйте это:

INSERT
INTO    tags (id, name)
SELECT  NULL, 'tagsName'
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    tags
        WHERE   name = 'tagsName'
        )
person Quassnoi    schedule 02.06.2012

INSERT INTO tags (name)
SELECT 'tagsName'
WHERE NOT EXISTS (SELECT 1 FROM tags WHERE name = 'tagsName');

OR

INSERT  OR IGNORE
INTO tags (id, name)
VALUES (NULL, 'tagsName')

если у вас есть уникальное ограничение

person user1166147    schedule 02.06.2012