автоинкрементные поля - срочно!

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
neznaika
Сообщения: 3
Зарегистрирован: 15 ноя 2005, 21:21

автоинкрементные поля - срочно!

Сообщение neznaika » 15 ноя 2005, 21:30

Есть таблица Lease:

CREATE DOMAIN "DNADDRS" AS CHAR(20) NOT NULL;
CREATE DOMAIN "DNDATE" AS TIMESTAMP;
CREATE DOMAIN "DNNUM" AS SMALLINT
CHECK (VALUE > 0) NOT NULL;

/* Table: LEASE, Owner: SYSDBA */

CREATE TABLE "LEASE"
(
"NLEASE" "DNNUM",
"NTN" "DNNUM",
"NON" "DNNUM",
"ADR" "DNADDRS",
"LDATE" "DNDATE",
PRIMARY KEY ("NLEASE")
);
ALTER TABLE "LEASE" ADD FOREIGN KEY ("NTN") REFERENCES TENANT ("NTN");
ALTER TABLE "LEASE" ADD FOREIGN KEY ("NON") REFERENCES OWNER ("NON");

В IBConsol создается следующий триггер:
set term^
create trigger ins_lease for lease
active before insert
as
begin
if (new.nlease is null) then
new.nlease=geN_id(num1,1);
end^
Где num1 - предварительно созданный генератор, lease - таблица, nLease - ключевое поле.
Триггер не работает!
При добавлении записи вручную в IBConsol получаем сообщение об ошибке "поле nlease не может быть пустым"
Что делать? (нужно, чтобы ключевое поле при добавлении записи заполнялось автоматически последовательными целочисленными значениями)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 15 ноя 2005, 21:58

Срочно нужно сделать следующее:

1. Забыть smallint как кошмарный сон. Наплачешься по любому с течением времени, не только в ключевых полях.
2. Подумать, так ли уж необходимо при запросах гонять по сетке концевые пробелы типа CHAR. Нет, если там предполагается что-то типа GUID держать, то оно, конешно, надо.
3. Подумать, так ли уж хочется при писании всех запросов в дальнейшем парить себе мозги с кавыками и соблюдением регистра буквиц в идентификаторах.
4. Выкинуть нафик консоль, судя по всему, образца 1812 года. Это сообщение не серверное. Скорее всего в TIBQuery или TIBDataSet, через которые оно работает, поле задано как required по неизречённой мудрости ея автора.

neznaika
Сообщения: 3
Зарегистрирован: 15 ноя 2005, 21:21

Сообщение neznaika » 15 ноя 2005, 22:22

Прошу прощения, но мне кажется, тип данных здесь не должен играть такой роли.

По какой-то причине триггер просто не запускается.
Например, когда мы делали каскадное удаление с помощью триггера, триггер не срабатывал до тех пор, пока не удалили ограничение Foreign Key. Здесь может, тоже что-то в таком духе? Только не удалять же primary key! Может, можно удалить только ограничение not null? А что тогда будет с ключом?

А консоль - уж какая есть в Delphi... version 1.0.1.340

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 15 ноя 2005, 22:29

Ндя... Так издали я мозги вправлять не берусь. Мож найдётся кто терпеливый.

neznaika
Сообщения: 3
Зарегистрирован: 15 ноя 2005, 21:21

Сообщение neznaika » 15 ноя 2005, 22:45

Спасибо за участие:) Будем дальше парить собственные кривые (или прямые?) мозги...

smu
Сообщения: 39
Зарегистрирован: 29 окт 2005, 10:12

Сообщение smu » 16 ноя 2005, 18:42

neznaika писал(а): ...
А консоль - уж какая есть в Delphi... version 1.0.1.340
Сходи на www.ibexpert.com. Про стандартную консоль забудь.

Dioxin
Сообщения: 26
Зарегистрирован: 03 июн 2005, 08:35

Сообщение Dioxin » 17 ноя 2005, 10:48

Насколько мне кажется - если чтото primary key, то оно и так not null.
Априори!

Ответить