Автоинкремент, делфи, зеос -> проблема

Savka
Дата: 28.09.2004 15:07:40
В этом форуме много тем по поводу автоинкрементного поля в таблице. Читал, но не нашел все же, как мне побороть свою проблему.
Создаю таблицу двумя способами:

1. CREATE TABLE tree (id serial, name varchar(20), parent int2);

2. CREATE SEQUENCE tree_seq;
CREATE TABLE tree(id integer NOT NULL DEFAULT nextval('tree_seq'),
name varchar(20),
parent int2,
PRIMARY KEY (id)
);

В обоих случаях создается то, что мне нужно.
И если я из шелла пытаюсь вставить данные в таблицу типа

INSERT INTO tree (name, parent) VALUES ('sdsdf', 1);

вставляет и само добавляет в поле id нужное, последовательное значение.

Если я пытаюсь из делфи вставить новую запись, то получаю, что поле id не может быть пустым. Если пишу туда какую-нибудь цифру - все ок, вставляется запись. Но это же неправильно.
Если пытаюсь ввести две одинаковые цифры - получаю ошибку.

В форуме нашел, что в поле id надо писать значение default. Но как это сделать? База ждет, что в поле будет вводиться цифра, а не символы.

В чем проблема то, а?
PJD
Дата: 29.09.2004 04:02:00
Никакой проблемы.

Если через ZQuery с RequestLive=True и CachedUpdates=False - то все нормально работает без указания значения, Zeos сам обновит serial-поле после Post (но не все запросы являются редактируемыми вживую).

Если CachedUpdates=True - исправь руками ZUpdateSQL.InsertSQL - напиши default или убери поле совсем. Но значение поля придется узнавать и устанавливать после ApplyUpdates (или переоткрывать запрос).

И наконец можно до отсылки изменений в базу в любом режиме в AfterInsert получить и присвоить nextval('serial_name_seq') отдельным запросом.
Savka
Дата: 29.09.2004 13:03:50
PJD
Если через ZQuery с RequestLive=True и CachedUpdates=False - то все нормально работает без указания значения, Zeos сам обновит serial-поле после Post (но не все запросы являются редактируемыми вживую).



Никакой проблемы в таком случае у меня не возникает, когда работаю с MySQL. В Postgree Zeos сам почему-то не хочет этого делать.

Вставляет запись только в случае, если в запросе опускается выборка поля serial. Сейчас раздумываю, подходит ли это мне.