Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.25;
Скачать: CL | DM;

Вниз

Ошибка при добавлении записи в таблицу 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.033 c
1-81643
Erik
2003-08-12 12:11
2003.08.25
Как пробежать по XML и считать атрибуты?


14-81903
DenKop
2003-08-04 21:10
2003.08.25
Песни через системный динамик


1-81640
Maxim Pshevlotsky
2003-08-14 06:21
2003.08.25
Как извлечь значок у файла зная только его расширение?


1-81777
777
2003-08-13 22:27
2003.08.25
Алгоритм


1-81791
frost
2003-08-14 08:57
2003.08.25
Как отобразить файл с письмом *.eml