Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];

Вниз

игнорировать дубликаты при 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
15-1315896174
>|<
2011-09-13 10:42
2012.01.01
Как програмно сшить несколько pdf-файлов в один?


8-1221793304
Cout
2008-09-19 07:01
2012.01.01
горизонтальный курсор


15-1316118584
Юрий
2011-09-16 00:29
2012.01.01
С днем рождения ! 16 сентября 2011 пятница


2-1317060923
oleg_teacher
2011-09-26 22:15
2012.01.01
Перевод png в jpg.


1-1278075174
ifmomax
2010-07-02 16:52
2012.01.01
Windows-service.Некорректное чтение бинарного файла.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский