Violation of primary or unique key constraint

Ири выполнении "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. > 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. >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]

Действительно, максимальный >Как такое может быть? Может, триггер глючит?


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. > 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]

Читайте также:  Samsung galaxy s9 звук в наушниках

-> 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)

Можешь и расписать в отдельной ветке, но если уже решил и во всем разобрался, то зачем ?

I am trying to insert a few values in an existing table, but first it makes nothing and 2nd time it shows me this error message.

My Unique KEY consists of a FK of a higher table and a counter.

If I check my tables there is no entry but it does not accept my UNIQUE Key.

Anybody with some ideas?

My test SQL Code for inserting into the view (same result with table)

For example my error message is:

violation of PRIMARY or UNIQUE KEY constraint "UK_BRESZ" on table "BRESZ". Problematic key value is ("MASKENKEY" = ‘ 60’, "BRES_ >

But there is no such entry in my table / view.

Violation of PRIMARY KEY constraint ‘PK_dboSM_AlarmsStatistics’. Cannot insert duplicate key in object ‘dbo.SM_AlarmsStatistics’. The duplicate key value is (ExceedingCur, 6061, 0). (Source: MSSQLServer, Error number: 2627)

в таблице SM_AlarmsStatistics составной индекс из трех колонок в которых должно содержаться (ExceedingCur, 6061, 0) из ошибки выше.

Я пробовал сделать truncate в этой таблице, но ошибка остается, хоть таблица и пустая.

Пробовал так же в эту таблицу вручную вставлять значения, все отлично вставляется в подписчике

Можно ли обновить как то составной индекс(что-то типа DBCC CHECKIDENT (@fullTableName, RESEED, @nextIdToGo)) или что сделать в таком случае?