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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> id несуществующей записи, Как получить id записи до вызова Post? 
:(
    Опции темы
opx
Дата 28.5.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я наверное что-то не понимаю, но все же
Есть 2 таблицы: 
Код

CREATE TABLE FIRMS (
  ID INTEGER NOT NULL,
  NAME VARCHAR(255),
  ID_CITY INTEGER);
ALTER TABLE FIRMS ADD PRIMARY KEY (ID);
ALTER TABLE FIRMS ADD CONSTRAINT FK_FIRMS FOREIGN KEY (ID_CITY) REFERENCES CITY(ID) ON DELETE SET NULL;

SET TERM ^ ;

CREATE TRIGGER BI_FIRMS_ID FOR FIRMS
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
      NEW.ID = GEN_ID(FIRMS_ID_GEN, 1);
END^

SET TERM ; ^

и
Код

CREATE TABLE CITY (
  ID INTEGER NOT NULL,
  NAME VARCHAR(100));
ALTER TABLE CITY ADD PRIMARY KEY (ID);

SET TERM ^ ;

CREATE TRIGGER BI_CITY_ID FOR CITY
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
      NEW.ID = GEN_ID(CITY_ID_GEN, 1);
END^

SET TERM ; ^

Т. е. записи добавляются, id генерируются. Одно непонятно.
Есть у меня информация о фирме: ООО "Форум", г. Н. Новгород
г. Н. Новгород отсутствует в таблице CITY
Если я вставлю запись в CITY то мне нужно ее ID передать в Firms да так, чтобы другой юзер в это время добавлял бы записи и получал свои ID. Как бы это сделать?
Если после метода Post вытаскивать запросом:
Код

SELECT GEN_ ID (NEWID, 1) FROM RDB$DATABASE

То я могу напороться на ID другого пользователя. Поправьте, если я ошибаюсь

Это сообщение отредактировал(а) opx - 28.5.2009, 13:10
PM MAIL   Вверх
Gluttton
Дата 28.5.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Код

INSERT INTO FIRMS(NAME, ID_CITY)
SELECT "ООО Форум", CITY.ID
FROM CITY
    WHERE CITY.NAME="Н.Новгород"


Так?

При этом рекомендую наложить на CITY.NAME ограничение UNIQUE, что б два Н.Новгорода не появилось smile !

Не давно (за последние две недели) на ветке форума "Базы данных" была тема про правильность написаня названий районов и городов, БД там какая то про гостиницы была... Так вот там было озвучено очень интересное (на мой взгляд) предложение реализации того, что бы корректно обробатывать ситуации, когда разные пользователи по разному называют города (например. Н.Новгород, Нов. Новгород, Новый Новгород), а БД при этом корректно относит их к одному (эталонному названию: Новый Новгород).

Это сообщение отредактировал(а) Gluttton - 28.5.2009, 14:10


--------------------
Слава Україні!
PM MAIL   Вверх
opx
Дата 28.5.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так то оно так... но 
Цитата
 Одно непонятно.
Есть у меня информация о фирме: ООО "Форум", г. Н. Новгород 
г. Н. Новгород отсутствует в таблице CITY


Добавлено через 4 минуты и 20 секунд
Нет. Этого города еще нет в списке. Нужно добавить город и Фирму с ID этого города и чтобы не пересечься с другим пользователем
PM MAIL   Вверх
Gluttton
Дата 28.5.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата

Нет. Этого города еще нет в списке. Нужно добавить город и Фирму с ID этого города и чтобы не пересечься с другим пользователем

И непременно одним запросом?

1. Выполняем запрос:
Код

SELECT *
FROM CITY
    WHERE CITY.NAME="Н.Новгород"


2. Если запрос возвращает NULL, то:
Код

INSERT INTO CITY(NAME) VALUES("Н.Новгород")


3. Не зависимо от результата п.п. 1, 2:
Код

INSERT INTO FIRMS(NAME, ID_CITY)
SELECT "ООО Форум", CITY.ID
FROM CITY
    WHERE CITY.NAME="Н.Новгород"


А как за один запрос выполнить это всё я не знаю. Возможно в этом может помочь EXCEPTION + TRIGGER + PROCEDURE.


--------------------
Слава Україні!
PM MAIL   Вверх
Deniz
Дата 28.5.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Код
id_City = Gen_ID(NEWID, 1);
insert into City (id, name) values(id_City, "Н.Новгород")
insert into firms(name, ID_City) values ("ООО Форум", id_City);

Если есть уникальный индекс в City по Name, то метод Gluttton, тоже подойдет, он просто забыл дописать вставку в City.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
opx
Дата 28.5.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так и думал, что я туплю. Спасибо, что подсказали
PM MAIL   Вверх
Bose
Дата 7.6.2009, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(opx @  28.5.2009,  11:52 Найти цитируемый пост)
Если после метода Post вытаскивать запросом:

SELECT GEN_ ID (NEWID, 1) FROM RDB$DATABASE

То я могу напороться на ID другого пользователя. Поправьте, если я ошибаюсь

Не напорешься, при условии что NEWID гарантированно больше самого большого ID в таблице. GEN_ID выполняется вне транзакций.
PM MAIL WWW Skype   Вверх
Deniz
Дата 8.6.2009, 05:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(Bose @  7.6.2009,  09:17 Найти цитируемый пост)
Не напорешься, при условии что NEWID гарантированно больше самого большого ID в таблице.
он просто получит новый уникальный ID, которого еще нигде нет.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

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

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

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

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

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

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


 




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


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

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