![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
(Oracle) Как правильно написать триггер для автоприсвоения ID [MySQL]
ANB © (2005-09-27 14:12:00)Попробовал сделать так :
create or replace trigger GT_Product_PK_TR
before insert on GT_Product
for each row
declare
begin
if :New.ID is null then
select GT_Product_SQ.Nextval into :New.ID from dual;
end if;
end GT_Product_PK_TR;
Получил проблему - если ID жестко задавать в инсертах, то сиквенс не мотается и потом лезут ошибки.
Переделал :
create or replace trigger GT_Product_PK_TR
before insert on GT_Product
for each row
declare
Cur_SQ number;
begin
if :New.ID is null then
select GT_Product_SQ.Nextval into :New.ID from dual;
else
select GT_Product_Firm_SQ.Currval into Cur_SQ from dual;
while (Cur_SQ < :New.ID) loop
select GT_Product_Firm_SQ.Nextval into Cur_SQ from dual;
end loop;
end if;
end GT_Product_PK_TR;
В таком варианте вроде, получше, но все равно можно нарваться на дублирование записей. Можно воткнуть еще проверку на существование уже сгенеренного ID и прокручивать сиквенс до нужного значения, но, во первых, полезут ошибки "таблица мутирует", во вторых это ничего особо не даст, т.к. если я умудрюсь в двух разных сессиях сгенерить один и тот же ID, то про триггер на них никак не поругается, так как записи еще не закоммичены, а проблема вылезет при коммите. Хотя, возможно, я не так понял механизм транзакций.
DenK_vrtz (2005-09-27 15:20:00) [101]>Sergey13 © (27.09.05 15:17) [9]
Зачем явно задавать значение :new.ID, если он берется из последовательности и формируется автоматически?
Sergey13 (2005-09-27 15:17:00) [102]2[7] DenK_vrtz © (27.09.05 15:09)
>зачем это условие? Если вставка данных то :New.ID изначально null
Inset into Table(ID, Field1) Values(99999999, 'xxx')
и где тут NULL?
Sergey13 (2005-09-27 15:10:00) [103]2[6] kesha © (27.09.05 14:56)
Тогда я не понял твоего
>pri vstavke "ID" - vsegda NULL
>esli tebe posle Insert gde-to nuzhen ID, to kak [5], tolko ne Procedure a Function:
Inset into Table(ID, Field1) Values(Get_New_ID(Table), xxx);
Как ты его отсюда получишь на клиенте?
DenK_vrtz (2005-09-27 15:09:00) [104]
> if :New.ID is null then
>
зачем это условие? Если вставка данных то :New.ID изначально null
select sqИмяПоследовательности.nextval into :new.id from dual; и больше никаких извращений
kesha (2005-09-27 14:56:00) [105]
> Sergey13 © (27.09.05 14:31) [4]
CREATE SEQUENCE -> ne v triggere, a v base.
ANB:
esli tebe posle Insert gde-to nuzhen ID, to kak [5], tolko ne Procedure a Function:
Inset into Table(ID, Field1) Values(Get_New_ID(Table), xxx);
esli tebe ID ne nuzgen:
Inset into Table(Field1) Values(xxx);
Андрей Жук (2005-09-27 14:42:00) [106]Как делаю я. У меня есть процедура, которая по имени таблицы возвращает следующий ID по сиквенсу. Процедурка отрабатывает мгновенно. После чего на клиенте есть уже уникальный ID, который и вставляем в insert.
Sergey13 (2005-09-27 14:31:00) [107]2[3] kesha © (27.09.05 14:26)
Это все зачем?
Это ты все в тригер хочешь написать? И ты думаешь будет работать? Мне кажется, даже не откомпилится.
Да и по смыслу... вернее смысла я не вижу.
kesha (2005-09-27 14:26:00) [108]if :new.ID is null then
SELECT GT_Product_SQ.Nextval into :New.ID from dual;
end if;
CREATE SEQUENCE "xxx"."GT_Product_SQ" INCREMENT BY 1 START
WITH 1 MAXVALUE 1.0E28 MINVALUE 1 CYCLE
CACHE 20 ORDER;
pri vstavke "ID" - vsegda NULL
Sergey13 (2005-09-27 14:20:00) [109]2ANB © (27.09.05 14:12)
Че-то ты мудришь, ИМХО.
>если ID жестко задавать в инсертах
Как жестко? Нафига жестко?
Можно и гвозди конечно микроскопом забивать. Вопрос - зачем?
select GT_Product_Firm_SQ.Currval
может и ошибку дать, если сессия еще не дергала этот сиквенс.
Андрей Жук (2005-09-27 14:18:00) [110]В MySQL появились триггеры???