![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
игнорировать дубликаты при 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 ?