Форум: "Начинающим";
Текущий архив: 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