Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Уникальное значение первичного ключа / 6 сообщений из 6, страница 1 из 1
21.06.2007, 12:00
    #34610207
MerkoIvan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальное значение первичного ключа
Доброго времени суток уважаемые знатоки!
У меня такая проблема:
Использую СУБД PostgreSQL а приложение пытаюсь сделать на Delphi. У первичного
ключа (ID) таблицы (Table) тип данных - автоинкрементный (serial).
При добавлении новой записи из приложения, написанного на Delphi, поле ID пустое, хотя должно формироваться значение, и при попытке сохранить добавленную запись говорит что в ID нет значения.

В InterBase такую проблему я решал созданием генератора и хранимой процедуры. При добавлении новой записи (событие OnNewRecord) вызывал хранимую процедуру, которая нормально ставила уникальное значение в ID.

В PostgreSQL генераторов не нашел. Как быть? Может быть есть какие-нибудь еще варианты?

Заранее благодарен.
...
Рейтинг: 0 / 0
21.06.2007, 12:21
    #34610308
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальное значение первичного ключа
MerkoIvanДоброго времени суток уважаемые знатоки!
У меня такая проблема:
Использую СУБД PostgreSQL а приложение пытаюсь сделать на Delphi. У первичного
ключа (ID) таблицы (Table) тип данных - автоинкрементный (serial).
При добавлении новой записи из приложения, написанного на Delphi, поле ID пустое, хотя должно формироваться значение, и при попытке сохранить добавленную запись говорит что в ID нет значения.

SERIAL это фиктивный тип данных. Когда pg видит поле типа SERIAL, он создает вместо него поле типа Int4, автоматом создает Sequence вида TABLENAME || "_Kod_Seq". И прописывает Default Value вида NextVal(TABLENAME || "_Kod_Seq").
Для начала проверьте, так ли это и получается ли добавить запись с валидным значением ключа из какого-нибудь PgAdmin.

Если из PgAdmin у вас получается добавить, а из Delphi нет, значит INSERT, который идет из Delphi несет в себе значение ключа:

INSERT INTO TABLENAME (ID, ...) VALUES (0, ...)

Для Pg это нормальная ситуация, что пользователь перебивает Default Value. В таком разе, смотрите как у вас натравлены insert'ы.
...
Рейтинг: 0 / 0
21.06.2007, 12:22
    #34610314
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальное значение первичного ключа
Sequences


MerkoIvanПри добавлении новой записи из приложения, написанного на Delphi, поле ID пустое, хотя должно формироваться значение, и при попытке сохранить добавленную запись говорит что в ID нет значения.

Это потому, что вы явно не указываете, что ID вставлять не надо.
То есть если таблица такая:
tab1 (id, col1,col2,col3),
то insert должен быть insert into tab1 (col1,col2,col3) values (val1, val2, val3); , без упоминания id.
...
Рейтинг: 0 / 0
21.06.2007, 12:26
    #34610335
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальное значение первичного ключа
Если я правильно понимаю и помню, проблема в дельфях. При добавлении новой строки, уникальное значение будет получено на сервере, уже после отсылки инсерта с клиента. А дельфи еще до отсылки проверяет заполнение обязательных полей и, видя, что поле не заполнено, тупо ругается, не задумываясь, что оно заполнится по умолчанию (кстати, интересно было бы попробовать - сделать поле NOT NULL, но со значением по умолчанию и посмотреть, как поведет себя дельфи, при попытке вставить туда пустое значение).
Кстати, подумалось, возможно при отсутствии значения, дельфи генерит что-то вроде
Код: plaintext
Insert into myTable (fld1, fld2) values('sdf', NULL)
Вместо того, чтобы сделать
Код: plaintext
Insert into myTable (fld1) values('sdf')
Т.е. просто пропустить. В общем, на мой взгляд, проблему нужно решать как-то в дельфях.

А аналог генераторов - сиквенсы (sequence). Если создается поле типа serial, то реально оно является полем типа int4 и при этом создается объект sequence, а в значение по умолчанию ставится вычисление nextval('<тут имя сиквенса>'::regclass)

PS. Для справки: Сиквенсы могут жить и самостоятельно. Это полноправный объект, который можно создать для своих целей (получения уникальных значений), не обязательно привязывая их к конкретной таблице. Собственно, они и не привязываются к таблице. Только условно, вышеобозначенным значением на DEFAULT поля.
...
Рейтинг: 0 / 0
24.07.2007, 09:30
    #34678888
MerkoIvan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальное значение первичного ключа
Спасибо всем за помощь. Проблему решил следующим способом, может кому пригодится:

DM.QPODR.InsertRecord([nil, nil, Edit1.text, Edit2.Text]);
...
Рейтинг: 0 / 0
05.07.2008, 09:53
    #35412867
Shagrat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальное значение первичного ключа
Нужно явно указывать тип поля в таблицы TAutoIncField - а то по умолчанию Delphi ставить TIntegerField. И в field указать свойство requed=False
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Уникальное значение первичного ключа / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]