Russian Qt Forum

Программирование => Базы данных => Тема начата: Martiro от Июль 31, 2008, 12:55



Название: Автоматическая вставка Даты-Время?
Отправлено: Martiro от Июль 31, 2008, 12:55
Реально ли запрограммировать ячейку так, чтобы при создании новой записи, в эту ячейку автоматом записывалось дата и время создания записи (в формате timestamp)?
Линтер-ВС (PostgreSQL 7)


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: Пантер от Июль 31, 2008, 13:31
У поля БД есть понятие default - это оно?


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: spirit от Июль 31, 2008, 13:38
а заюзать PL/SQL триггер BEFORE INSERT?


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: Martiro от Июль 31, 2008, 13:50
Что заdefault ?
Как прописать правильно этот тригер BEFORE INSERT?
А то документации под рукой нет...


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: spirit от Июль 31, 2008, 13:59
документация http://www.postgresql.org/docs/7.4/interactive/sql-createtrigger.html (http://www.postgresql.org/docs/7.4/interactive/sql-createtrigger.html)


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: spirit от Июль 31, 2008, 14:03
default-значение задается при создании таблицы в конструкции CREATE TABLE или ALTER TABLE для конкретного поля.
например:
Код:
CREATE TABLE "users"
(
"login"   varchar(20)  NOT NULL ,
"password"   varchar(20)  NULL ,
"loginedtime"   date   DEFAULT  '31.07.2008' NOT NULL ,
            CONSTRAINT "loginKey" PRIMARY KEY("login")
);
http://www.postgresql.org/docs/7.4/interactive/sql-createtable.html (http://www.postgresql.org/docs/7.4/interactive/sql-createtable.html)

но я так понимаю в вашей ситуации это не кактит, т.к. надо задавать дату при создании строки,  я правильно понял?


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: Martiro от Июль 31, 2008, 14:24
Да, не катит.
Нужно при добавлении записи в таблицу, автоматом заполнить последнее поле.
Я так понимаю, выглядеть это будет примерно так:
CREATE TRIGGER
   tab_dt_ins BEFORE INSERT OR UPDATE ON table1  ? ? ?

А как дальше писать? Функция, которую нужно использовать это "current_timestamp"? Или нужно свою прописывать?


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: Admin от Июль 31, 2008, 14:30
чем не катит в default поставить NOW()?
это для UPDATE нужно тригер вставлять


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: spirit от Июль 31, 2008, 14:30
этой функции будет достаточно http://www.postgresql.org/docs/7.4/interactive/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT (http://www.postgresql.org/docs/7.4/interactive/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT)


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: spirit от Июль 31, 2008, 14:45
чем не катит в default поставить NOW()?
это для UPDATE нужно тригер вставлять


тоже вариант  :)


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: Admin от Июль 31, 2008, 16:34
радует что народ postgres пользует
а то для веба все mysql да mysql


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: Martiro от Август 01, 2008, 09:03
Я так понимаю, мы пришли к тому, что в моем случае при создании таблицы нужно в DEFAULT писать NOW() или CURRENT_TIMESTAMP:
Код:
CREATE TABLE "users"
(
"login"   varchar(20)  NOT NULL ,
"password"   varchar(20)  NULL ,
"loginedtime"   timestamp   DEFAULT CURRENT_TIMESTAMP,
            CONSTRAINT "loginKey" PRIMARY KEY("login")
);
Чего-то не выходит... Таблица создается, но при добавлении записи, поле "loginedtime" не заполняется.


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: spirit от Август 01, 2008, 09:14
попробуй так:
Код:
CREATE TABLE "users" (
  "login" varchar(60) NOT NULL,
  "password" varchar(60) NOT NULL,
  "logintime" timestamp DEFAULT NOW(),
  CONSTRAINT "loginKey" PRIMARY KEY("login")
);
проверял, работает.


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: Martiro от Август 01, 2008, 09:36
Да... работает. В консоле все ОК, а вот из приложения не получается.
Делаю все на QT3. Записи вставляю с помощью QSqlRecord::setValue(...); для каждого поля:
Код:
curRecord->setValue(fieldUserNumb, iNumber);
curRecord->setValue(fieldUserAddr, writeString(edAddr->text()));
curRecord->setValue(fieldUserPhone, writeString(edPhone->text()));
В поле fieldUserDateedit (время добавления записи) ничего не пишу... оно и не пишется даже после DEFAULT NOW()...


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: spirit от Август 01, 2008, 09:40
Да... работает. В консоле все ОК, а вот из приложения не получается.
Делаю все на QT3. Записи вставляю с помощью QSqlRecord::setValue(...); для каждого поля:
Код:
curRecord->setValue(fieldUserNumb, iNumber);
curRecord->setValue(fieldUserAddr, writeString(edAddr->text()));
curRecord->setValue(fieldUserPhone, writeString(edPhone->text()));
В поле fieldUserDateedit (время добавления записи) ничего не пишу... оно и не пишется даже после DEFAULT NOW()...
код отвечает за инсерт или за апдейт?


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: Martiro от Август 01, 2008, 09:46
Да... скорее всего в этом и дело. Покапавшись, понял, что скорее всего запись сначала создается, а потом обновляется из буфера. :(
А как через тригер?


Название: Re: Автоматическая вставка Даты-Время?
Отправлено: Tonal от Август 02, 2008, 08:08
Похоже, оно при формировании инсерта указывает все поля, и несбинденным подставляет NULL - т.е. значение DEFAULT для поля не учитывается.
Нужно посмотреть (в ассистенте и исходниках), можно ли изменить это поведение - т.е. не указывать несбинденные поля.

Если нет, придётся или формировать инсерт вручную, или писать триггер.