Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.091 c
1-81653
go
2003-08-12 11:25
2003.08.25
install D7


8-81846
Василий Петрович
2003-04-15 09:28
2003.08.25
Как играть xm?


1-81689
hoy
2003-08-11 01:00
2003.08.25
richedit и т.п.


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


14-81894
Е-Моё имя
2003-08-05 13:15
2003.08.25
откуда прога запущена под DOS(!!!) ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский