Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Первичный ключ и автоинкрементность


Автор: Anark1 1.8.2007, 12:06
Простой вопрос.
Насколько я понимаю одновременно поле не может являться первичным ключом и счетчиком, так?

Автор: chand0s 1.8.2007, 12:46
В Firebird-Interbase в принципе нет такой вещи как счетчик.
Читайте http://www.ibase.ru/devinfo/generator.htm.

Конкретно по поводу Вашего вопроса - может.

Код

CREATE TABLE PEOPLE (
    NAME  VARCHAR(128) NOT NULL,
    AGE   INTEGER NOT NULL,
    ID    INTEGER NOT NULL
);

/* Делаем поле ID первичным ключем */
ALTER TABLE PEOPLE ADD CONSTRAINT PK_PEOPLE PRIMARY KEY (ID);

/* Создание генератора и триггера, который при каждой вставке генерирует новое значение и "запихивает" его в поле ID */
CREATE GENERATOR GEN_PEOPLE_ID;

CREATE TRIGGER PEOPLE_BI FOR PEOPLE
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_people_id,1);
end


Автор: Anark1 1.8.2007, 13:05
chand0s, 
У меня аналогичный код. Я знаю, что auto increment можно обеспечить наличием триггера и генератора.
Вопрос вот тут :
Код

CREATE TABLE PEOPLE (
    NAME  VARCHAR(128) NOT NULL,


Код

if (new.id is null)


Как это может выполняться? id не NULL, а в триггера IF (NEW.ID NULL)

Автор: Anark1 1.8.2007, 13:30
Вопрос закрыт. Ошибка среды. 

Автор: chand0s 1.8.2007, 14:13
Цитата(Anark1 @ 1.8.2007,  11:30)
Вопрос закрыт. Ошибка среды.

ты можешь написать запрос как
Код

insert into PEOPLE(name, age) values('Пупкин В.В.', 20)


так 
Код

insert into PEOPLE(name, age, id) values('Пупкин В.В.', 20, 4431)


Для второго запроса триггер "не сработает".

Автор: Anark1 1.8.2007, 15:28
Я даже не составлял SQL.
пока что просто забивал в GRID

Автор: Bose 1.8.2007, 16:35
Цитата(Anark1 @  1.8.2007,  13:05 Найти цитируемый пост)
 Как это может выполняться? id не NULL, а в триггера IF (NEW.ID NULL)

Такую проверку нужно делаит до того как данные окажутся в таблице. Как правило, это Before Insert триггеры или Before Update.

Код

if (new.id is null) then
  new.id = GEN_ID(DEN_MY_GENERATOR_ID, 1);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)