Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2013, 20:04   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
И какова будет скорость Базы при частых таких запросах?
Скорость будет нормальная если индекс есть по тому полю (полям), по которому поиск
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.08.2013, 22:00   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как поступать? Искать её на наличие, а по результату уже выполнять UPDATE или INSERT?
Я так и поступаю. Тормоза меня еще не посещали, хотя иногда приходится на удаленном компе выполнять 10000 таких запросов (всмысле селект один, а инсертов тысячи). Не жалуюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2013, 08:43   #13
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
то после второго вызова этой же операции произойдёт уже не INSERT, а UPDATE, что соответствует инструкции, но... будет обновлено значение первичного ключа из генератора на новое.
немного не так) ... нужно видеть текст тригера который генерит ft_id.
Цитата:
Зачем update or INSERT в таблицу, в которой значение ключа триггером генерируется? Эта конструкция для таблиц, в которых это значение программно создается и не более того
не соглашусь. очень полезная функция. у меня она всегда в таких таблицах юзается. тут главное верный подход к ключевым полям.
вся фишка в том что если тригер имеет вид
Код:
NEW.ft_id = GEN_ID(generator, 1);
то будет ошибка, а если в тригере текст
Код:
IF (NEW.ft_id IS NULL) THEN 
  NEW.ft_id = GEN_ID(generator, 1);
- то такая конструкция будет успешно обрабатываться с помощью UPDATE OR INSERT
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 19.08.2013 в 08:46.
Yurk@ вне форума Ответить с цитированием
Старый 20.08.2013, 17:41   #14
Pashka_cool
 
Регистрация: 17.08.2013
Сообщений: 8
По умолчанию

вот мой триггер:
AS
begin
if (NEW.indexid is NULL)
then NEW.indexid = next value for gen_a_ftypes_id;
end
И при втором подряд "UPDATE or INSERT" выдаёт ошибку нарушения уникальности.
А вот пример двух команд подряд:
update or insert into a_ftypes(ftname, ftdescr, ft_id) values('DEFAULT', '', 12) matching(ft_id);
update or insert into a_ftypes(ftname, ftdescr, ft_id) values('DEFAULT', '', 22) matching(ft_id);

При этом обе должны выполнить INSERT, т.к. обоих записей ещё нет. Уникальное поле "ft_id". Но это не ключевое поле, а просто уникальное. Ключевое поле не упомянуто, его имя "indexid". Оно должно автоматически сгенерироваться триггером при INSERT-е. А при повторном выполнении будет уже UPDATE и это поле "indexid" просто и не меняется.
И вот эта задача не работает. Выдаёт ощибку:
Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values.
violation of PRIMARY or UNIQUE KEY constraint "PK_A_FTYPES" on table "A_FTYPES".
При этом поле "indexid" - ключевое.
Поле "ft_id"- просто уникальное, чисто идентифиактор целочисленный. Потому именно по "ft_id" идёт MATCHING в выражениях.
Вот и вся ситуация.
Pashka_cool вне форума Ответить с цитированием
Старый 20.08.2013, 18:58   #15
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
При этом обе должны выполнить INSERT, т.к. обоих записей ещё нет.
О_о
а на кой тогда генератор если ты вручную указываешь ft_id?
и еще, покажи что у тебя за индекс PK_A_FTYPES ? на какие он поля и какие настройки уникальности?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 20.08.2013, 20:30   #16
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Триггер на какое событие?
Vapaamies вне форума Ответить с цитированием
Старый 20.08.2013, 21:07   #17
Pashka_cool
 
Регистрация: 17.08.2013
Сообщений: 8
По умолчанию

праймари ключ PK_A_FTYPES на поле INDEXID. Триггер берёт из генератора именно для него значение. А поле FT_ID задаёт пользователь, но оно тоже уникально. Это поле содержит некое справочное значение, на которое код реагирует, когда загружает данные из таблицы. Имеется ввиду код софта.
Pashka_cool вне форума Ответить с цитированием
Старый 20.08.2013, 21:50   #18
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

ну он у тебя и ругается на INDEXID.
если есть фозможность - выложи файлик с БД. где-то у тебя косяк закрался
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 20.08.2013, 22:22   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Надыбал интересное обсуждение похожей проблемы
http://www.sql.ru/forum/893230/inser...te-ne-rabotaet
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.08.2013, 15:52   #20
Pashka_cool
 
Регистрация: 17.08.2013
Сообщений: 8
По умолчанию

АВАТАР, спасибо за статью. Очень похожая ситуация, действительно.
Либо данный операнд довольно хрупок в применении (и мне не удалось подобрать к нему "ключи"), либо он вообще недопилен в этой версии сервера. Не могу судить об этом однозначно. По крайней мере то, как я пытаюсь им пользоваться сугубо интуитивно и очевидно - не работает. Стоило бы обратиться к разработчикам Базы, т.к. в другом случае мы все подойдём к позиции "научного тыка" и большой потери времени. У меня проект через месяц должен быть запущен в первой версии, потому буду делать "медленное но верное" решение. Потом время покажет. Может быть и вправду даже при моей нагрузке тормазо меня не посетят (а точнее мой продукт и мою Базу).
Pashka_cool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UPDATE OR INSERT по нескольким таблицам в одной процедуре Dozent БД в Delphi 1 21.02.2013 16:40
Invalid insert or update value(s): object columns are constrained BarakudaX777 БД в Delphi 2 17.09.2012 08:28
UPDATE, INSERT, DELETE в DataGridView C# Ramirag Помощь студентам 3 04.09.2011 13:24
выполнение запросов(Insert,Update) Rio309 C# (си шарп) 1 20.03.2011 17:10
insert и update Tanusha SQL, базы данных 4 13.03.2009 14:47