Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


LDV ©   (2011-09-20 13:22:00) 

на входе строка идентификаторов (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


Jeer   (2011-09-21 19:44:00) [1]


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


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


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

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


Jeer   (2011-09-20 18:31:00) [3]

Для 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;


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

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


Anatoly Podgoretsky   (2011-09-20 14:48:00) [5]

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

"Duplicate key found"


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

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


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


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


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


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

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


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

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

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

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


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


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


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


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

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

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


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

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

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


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

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

function AddRelatedProducts(RelatedProductsIds: string): Integer


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

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


stas   (2011-09-20 13:46:00) [14]

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо