Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.01;
Скачать: CL | DM;

Вниз

игнорировать дубликаты при insert -запросе   Найти похожие ветки 

 
LDV   (2011-09-20 13:22) [0]

на входе строка идентификаторов (17, 22, 54, ...), нужно сделать insert-запрос, который бы вставил записи игнорируя дубликаты. т.е. моджно ли это сделать в СУБД DBISAM? INSERT IGNORE не прокатывает.

Таблица A
ItemId, ParentId
1 56
2       17
3       94

В итоге должно получиться:

Таблица A
ItemId, ParentId
1 56
2       17
3       94
4       22
5       94


 
Сергей М. ©   (2011-09-20 13:35) [1]

Т.е. ты хочешь чтобы при выполнении INSERT-запроса, предпринимающего попытку нарушения уникальности значений в некоем ключевом поле, СУБД спустила на тормозах это безобразие и не вернула соответствующей ошибки, как будто бы запись была успешно создана ?
А что тогда должно показать св-во rows affected ?


 
stas ©   (2011-09-20 13:46) [2]

как вариант использовать промежуточную таблицу, сгруппированный результат которой вставить в Таблицу A


 
LDV   (2011-09-20 13:48) [3]

у меня есть таблица Товары (Id, Name, ...) и таблица Сопутствующие товары (Id, ParentId, ...). + Есть ком-сервер с функцией, которая определяет для товара сопутствующие товары.

function AddRelatedProducts(RelatedProductsIds: string): Integer


пользователь в функцию передает список идентификаторов (1, 2, 3, ...) сопутствующих товаров для товара. мне в теле функции нужно проверить, чтобы для товара не был назначен сопутствующий товар с идентификатором из списка - такие нужно игнорировать.

пока что делаю так: для товара из таблицы получаю список идентификаторов сопутствующих товаров (SELECT). дальше из списка RelatedProductsIds: string удаляю те, который есть в списке, полученном из таблицы. Что остается - встявляю (INSERT). Хотелось бы проверку на дубликаты делать в INSERT, если это возможно.


 
Сергей М. ©   (2011-09-20 14:02) [4]

А чем такая схема не устраивает ?

for each Id in RelatedProductsIds do
try
 Insert(Id)
except  
end


 
И. Павел ©   (2011-09-20 14:06) [5]

> [4] Сергей М. ©   (20.09.11 14:02)

А как отличить ошибку разрыва связи от ошибки вставки уже содержащегося ключа?


 
Сергей М. ©   (2011-09-20 14:07) [6]


> И. Павел ©   (20.09.11 14:06) [5]


Как обычно - добавив анализатор исключения в except-блок


 
LDV   (2011-09-20 14:27) [7]

вот такое сообщение

... class EDBISAMEngineError with message DBISAM Engine Error # 9729 Duplicate key found in the index "Primary" of the table "content"

а как узнать, что ошибка связана с дубликатом


 
Сергей М. ©   (2011-09-20 14:29) [8]


> как узнать, что ошибка связана с дубликатом


Вот по этому самому нативному коду ошибки 9729 и узнать.


 
LDV   (2011-09-20 14:29) [9]

try
               CommandQuery.ExecSQL;
             except
               if E is EDBISAMEngineError then
                 try
                   // ?????????????
                 except
                 end;
               else
                 raise;
             end;


 
Сергей М. ©   (2011-09-20 14:33) [10]

http://www.delphisources.ru/pages/faq/base/edbengineerror.html


 
Anatoly Podgoretsky ©   (2011-09-20 14:48) [11]

> LDV  (20.09.2011 14:27:07)  [7]

"Duplicate key found"


 
MsGuns ©   (2011-09-20 18:00) [12]

Ищи информацию по кл.слову "репликация"


 
Jeer ©   (2011-09-20 18:31) [13]

Для DBISAM лови:

procedure ShowDBErrors_(E: Exception);
var
 s: string;
 i: integer;
begin
 i := GetDBErrors_(E);
 case i of
   DBISAM_OSEACCES: s := "Таблица эксклюзивно занята !";
   DBISAM_KEYVIOL: s := "Повторение уникальной записи !";
   DBISAM_KEYORRECDELETED: s := "Запись изменена или удалена !";
   DBISAM_RECNOTFOUND: s := "Запись не найдена !";
   DBISAM_LOCKED: s := "Таблица занята другим пользователем !";
   DBISAM_RECLOCKFAILED: s := "Запись занята другим пользователем !";
 else
   s := "Ошибка №";
 end;
 MsgWarn_(s + "  (" + IntToStr(i) + ")");
end;

function GetDBErrors_(E: Exception): integer;
begin
 if (E is EDatabaseError) and (E is EDBISAMEngineError) then
   Result := (EDBISAMEngineError(E).Errors[0].ErrorCode)
 else
   Result := 99999;
end;


 
Труп Васи Доброго ©   (2011-09-21 11:37) [14]

Нифига не понял!!! Куда что вставлять??? По русски объясни. К примеру есть товары и подтовары=сопутствующие. Покупатель выбирает товар и подтовары к нему, например: товар=стиральная машинка, подтовары=запасная крышка,  ремень. Функция проверяет по базе что к этой машинке кроме крышки и ремня положено впарить покупателю ещё и ящик калгона и если его покупатель не выбрал, то она автоматом его добавляет. Я правильно понял??? Если так, то нафига проверки??? Просто забивай ВСЁ, что положено с товаром БЕЗ всяких проверок, зачем огород городить???
Или объясни по нормальному, не ленись печатать.


 
Jeer ©   (2011-09-21 19:44) [15]


> Просто забивай ВСЁ


Действительно :)



Страницы: 1 вся ветка

Текущий архив: 2012.01.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
15-1315686587
Юрий
2011-09-11 00:29
2012.01.01
С днем рождения ! 11 сентября 2011 воскресенье


2-1316690831
Laguna
2011-09-22 15:27
2012.01.01
Позиционирование в Combobox по значению объекта


15-1316092535
Jeer
2011-09-15 17:15
2012.01.01
База данных ФИО


1-1278078716
istok
2010-07-02 17:51
2012.01.01
Treeview в стиле windows7


15-1316151747
stdin
2011-09-16 09:42
2012.01.01
Firebird data comparer