Форум: "Базы";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];
ВнизОшибка при добавлении записи в таблицу Interbase Найти похожие ветки
← →
sashag (2003-07-30 09:38) [0]Ири выполнении "insert into table1 (name) values "aaa""
возникает ошибка
"violation of PRIMARY or UNIQUE KEY constraint "INTEG_13" on table "TABLE1""
Таблица имеет структуру
(id INTEGER NOT NULL,
name CHAR(50),
( id) Ири выполнении "insert into table1 (name) values "aaa""
возникает ошибка
"violation of PRIMARY or UNIQUE KEY constraint "INTEG_13" on table "TABLE1""
Таблица имеет структуру
(id INTEGER NOT NULL,
name CHAR(50),
PRIMARY KEY(id))
Поле id - автоинкрементное (триггер со счетчиком)
Не могу понять причину этой ошибки. Может, кто встречался с таким?
← →
stud (2003-07-30 09:41) [1]сделай так:
"insert into table1 (id,name) values (gen_id(имя_генератора,1),"aaa")
а тригер отключи
← →
Соловьев (2003-07-30 09:42) [2]
> Поле id - автоинкрементное (триггер со счетчиком)
на какое событие?
← →
sashag (2003-07-30 09:45) [3]-> Соловьев
Триггер на событие BEFORE INSERT
← →
Sergey13 (2003-07-30 09:55) [4]А с генератором никто ничего не делал? И тело тригера посмотреть бы. И откуда запрос идет из твоей программы или какого либо ИБЭксперта?
← →
stud (2003-07-30 09:57) [5]если вставка через запрос, зачем еще тригеры плодить?
← →
Соловьев (2003-07-30 09:57) [6]
> sashag © (30.07.03 09:45
покажи текст триггера. а генератор включен?
← →
Соловьев (2003-07-30 10:01) [7]
> если вставка через запрос, зачем еще тригеры плодить?
инетересно , а почему ты решил, что при использовании запросов триггеры не нужны? это никак не связано. кстати, а когда запросы не участвуют при работе с БД?
← →
stud (2003-07-30 10:05) [8]ну это смотря какой запрос. просто используя тригеры я в свое время столкнулся с некоторыми неудобствами, особенно при добавлении данных в гриде.
если он выполняет запрос
"insert into table1 (name) values "aaa"", то чем сложнее
"insert into table1 (id,name) values (gen_id(имя_генератора,1),"aaa")
но отпадает головная боль по поводу почему где-то что-то не работает
← →
sashag (2003-07-30 10:09) [9]Текст триггера
CREATE TRIGGER "TRG_TABLE1" FOR "TABLE1"
ACTIVE BEFORE INSERT POSITION 0
AS BEGIN NEW.ID= GEN_ID(Table1_GEN, 1);
END
Генератор включен.
Запрос делаю с помощью TIBQuery, ... попробовал через ISQL - тот же результат.
Отключил триггер, вставляю запись так, как советовал stud - та же ошибка
← →
Соловьев (2003-07-30 10:11) [10]CREATE TRIGGER "TRG_TABLE1" FOR "TABLE1"
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
( Table1_GEN,1) CREATE TRIGGER "TRG_TABLE1" FOR "TABLE1"
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(Table1_GEN,1);
END
← →
stud (2003-07-30 10:12) [11]а на дубликаты id проверял? может ты пытаешся добавить существующий id?
просмотри id в таблице и проверь текущее значение генератора
← →
Smashich (2003-07-30 10:12) [12]а занчение генератора не может быть установленно на меньшее чем наибольший ид в таблице?
← →
stud (2003-07-30 10:13) [13]Соловьев
а на null зачем проверять?
← →
stud (2003-07-30 10:14) [14]set generator to значение
← →
Соловьев (2003-07-30 10:14) [15]
> ну это смотря какой запрос. просто используя тригеры я в
> свое время столкнулся с некоторыми неудобствами, особенно
> при добавлении данных в гриде
я так работаю - проблем нет. может ты забыл у Field.Required = false;
← →
stud (2003-07-30 10:15) [16]нет. кажется проблема была именно с версиями записи. по другому объяснить не получается
← →
sashag (2003-07-30 10:16) [17]Действительно, максимальный ID = 48, а значение счетчика - 12...
Как такое может быть? Может, триггер глючит?
← →
Zacho (2003-07-30 10:20) [18]
> sashag © (30.07.03 10:16)
Приведи текст триггера.
← →
sashag (2003-07-30 10:20) [19]Есть какой-то способ исключить такие ситуации?
← →
sashag (2003-07-30 10:21) [20]Текст триггера
CREATE TRIGGER "TRG_TABLE1" FOR "TABLE1"
ACTIVE BEFORE INSERT POSITION 0
AS BEGIN NEW.ID= GEN_ID(Table1_GEN, 1);
END
← →
stud (2003-07-30 10:22) [21]инзмени значение генератора.
set generator table1_gen to 49
← →
Zacho (2003-07-30 10:27) [22]
> stud © (30.07.03 10:15)
Не бывает такого. У генератора нет никаких версий.
> sashag © (30.07.03 10:21)
Все нормально, но советую обратить внимание на Соловьев © (30.07.03 10:11) - тебе вполне может понадобиться получать новое ID в приложении, а не в триггере. Читай http://www.ibase.ru/devinfo/generator.htm
В общем, похоже, что кто-то (или что-то) просто установил значение генератора на одно из предидущих. Как это могло произойти - тебе лучше знать.
← →
sashag (2003-07-30 10:27) [23]-> stud
Теперь вручную можно изменить, но если это повторится при работе приложения у заказчика и с другой таблицей?
Как исправлять эту ошибку автоматически?
← →
Zacho (2003-07-30 10:30) [24]
> sashag © (30.07.03 10:27)
А просто не должно такого быть. Не может генератор сам по себе изменить значение. По крайней мере, я такого не разу не видел.
← →
stud (2003-07-30 10:32) [25]автоматически?
такого быть не должно!!!
to Zacho
при чем генератор?? многоверсионность полей
← →
Zacho (2003-07-30 10:35) [26]
> stud © (30.07.03 10:32
Ну и какое отношение версионность имеет к генераторам ?
← →
sashag (2003-07-30 10:41) [27]Я не очень хорошо знаю Interbase, поэтому не понимаю, что такое "многоверсионность полей". Может, это тоже причина, просто я не могу определить?
← →
Zacho (2003-07-30 10:45) [28]
> sashag © (30.07.03 10:41)
Да не какая это в данном случае не причина. А про многоверсионность записей и прочее читай статьи на http://www.ibase.ru/develop.htm
← →
sashag (2003-07-30 10:46) [29]Кстати, тип поля id у меня не INTEGER, а NUMERIC(18, 0) - чтобы "больше влезло". Это не может быть причиной неправильной работы счетчика?
← →
Zacho (2003-07-30 10:58) [30]Нет, у генератора в IB6, насколько помню, тип INT64.
А переполнение, в принципе, вполне могло быть, хотя и очень маловероятно, что ты успел в эту таблицу вставить больше 2^64 записей.
← →
sashag (2003-07-30 11:06) [31]>Zacho
Тип поля NUMERIC(18, 0) нужен потому, что записи при нормальной работе приложения будут добавляться в больший количествах.
> ALL
Кстати, спасибо всем за помощь - я понял, где проблема, и главное - ПОЧЕМУ она возникла.
Дело в том, что я переписываю программу, ранее работавшую с таблицами Paradox, на Interbase. Естественно, что БД уже заполнена, и пришлось импортировать ее в Interbase. А начальные значения счетчиков я установил в 0!!! Во отсюда все и пошло...
← →
stud (2003-07-30 11:07) [32]вообще речь шла о том, что значение генератора подставляется в поле тригером. new.f1=
и просто я столкнулся с тем, что у меня при работе с гридом вместо одной строки отображалось две, относящиеся к одной и той же записи....
в общем я этим я разобрался
← →
Zacho (2003-07-30 11:14) [33]
> stud © (30.07.03 11:07)
А все это потому, что при работе с гридом, следующее значение генератора надо было получать в приложении, а не в триггере, и соответственно заполнять ПК тоже из приложения.
А версионность здесь все-таки абсолютно ни причем.
← →
stud (2003-07-30 11:58) [34]ну я не подробно описываю проблему. если есть желание могу отдельно расписать))))
← →
Zacho (2003-07-30 12:04) [35]
> stud © (30.07.03 11:58)
Можешь и расписать в отдельной ветке, но если уже решил и во всем разобрался, то зачем ?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.01 c