Вставка отдельных данных в Firebird с помощью ZeosLib и Delphi

Я использую Zeos 7 и Delphi 2009 и хочу проверить, находится ли значение в базе данных в определенном поле, прежде чем отправлять данные в базу данных.

Пример: Ключевое слово поля
Значения Cheese, Mouse, Trap

tblkeywordKEYWORD.Value = Cheese

Что не так со следующим? И есть ли лучший способ?

zQueryKeyword.SQL.Add('IF NOT EXISTS(Select KEYWORD from KEYWORDLIST ='''+
  tblkeywordKEYWORD.Value+''')INSERT into KEYWORDLIST(KEYWORD) VALUES ('''+
  tblkeywordKEYWORD.Value+'''))');
zQueryKeyword.ExecSql;

Я пытался использовать уникальное ограничение в IBExpert, но выдает следующую ошибку:

Неверное значение(я) для вставки или обновления: столбцы объекта ограничены – никакие 2 строки таблицы не могут иметь повторяющиеся значения столбцов. попытаться сохранить повторяющееся значение (видимое для активных транзакций) в уникальном индексе «UNQ1_KEYWORDLIST».


person Brad    schedule 10.05.2010    source источник
comment
Ваш оператор SQL в том виде, в котором он опубликован, содержит несопоставленные скобки, поэтому маловероятно, что вы получите показанную ошибку - вместо этого Zeos должен выдать синтаксическую ошибку.   -  person mghie    schedule 10.05.2010
comment
Это сообщение об ошибке связано с попыткой выполнить уникальное ограничение в IBExpert, а не из SQL.   -  person Brad    schedule 10.05.2010


Ответы (1)


Рассмотрите возможность использования операторов UPDATE OR INSERT или MERGE:

update or insert into KEYWORDLIST (KEYWORD) values(:KEYWORD) matching(KEYWORD)

Подробности см. в следующих документах в папке установки Firebird:

  • документ\sql.extensions\README.update_or_insert.txt
  • документ\sql.extensions\README.merge.txt
person da-soft    schedule 10.05.2010
comment
Дмитрий, купил бы ваши комплектующие, но по моему нынешнему бюджету. - person Brad; 14.05.2010
comment
Ну, вы всегда можете попросить скидку. - person da-soft; 14.05.2010