Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Первичный ключ и автоинкрементность 
V
    Опции темы
Anark1
Дата 1.8.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



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



--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
chand0s
Дата 1.8.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.2.2007

Репутация: 1
Всего: 3



В Firebird-Interbase в принципе нет такой вещи как счетчик.
Читайте про генераторы.

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

Код

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


PM MAIL   Вверх
Anark1
Дата 1.8.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



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

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


Код

if (new.id is null)


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


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
Anark1
Дата 1.8.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



Вопрос закрыт. Ошибка среды. 


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
chand0s
Дата 1.8.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.2.2007

Репутация: 1
Всего: 3



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

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

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


так 
Код

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


Для второго запроса триггер "не сработает".
PM MAIL   Вверх
Anark1
Дата 1.8.2007, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



Я даже не составлял SQL.
пока что просто забивал в GRID


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
Bose
Дата 1.8.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: нет
Всего: 51



Цитата(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);


PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0948 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.