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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация связи 1:1 
V
    Опции темы
Gluttton
Дата 27.9.2010, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Доброго времени суток!

Возникла практическая задача, при решении которой целесеообразно реализовать связь один-к-одному.

Не обладая опытом работы с СУБД, я реализовал ограничение с использованием триггера:
Код

SET TERM ^;

CREATE TRIGGER breakage_notice_fk FOR breakage_notice
ACTIVE BEFORE
INSERT OR UPDATE POSITION 1
AS 
DECLARE VARIABLE result BIGINT;
BEGIN
    SELECT breakage_id FROM breakage_notice 
    WHERE breakage_id = NEW.breakage_id 
        ROWS 1 TO 1 INTO :result;    
    IF (:result IS NOT NULL)
    THEN BEGIN
    EXCEPTION one_to_one_relation;
    END
END^

SET TERM ;^


Но как я узнал позднее этот способ череват ошибками, которые могут вывести БД из согласованного состояния.

Вопрос: как в Firebird (2.5) можно реализовать ограничение один-к-одному?

В качестве тестовых данных предлагаю (все "наполнение" таблиц умышленно удалено с целью упрощения, я думаю, что это не повлияет на суть решения проблемы, т.о. оставлены только ключевые поля):
- таблица учета неисправностей (не типов неисправностей, а именно фактов неисправностей):
Код

CREATE TABLE breakage (
    id                  bigint not null
);

ALTER TABLE breakage
    ADD CONSTRAINT pk_breakage
    PRIMARY KEY (id);

- таблица уведомлений о неисправности (согласно бизнес-логике одной неисправности может соответствовать одно уведомление, более того само уведомление и определяет сам факт возникновения неисправности):
Код

CREATE TABLE breakage_notice (
    breakage_id         bigint not null,
    id                  bigint not null
);

ALTER TABLE breakage_notice
    ADD CONSTRAINT pk_breakage_notice
    PRIMARY KEY (id);

ALTER TABLE breakage_notice
    ADD CONSTRAINT fk_breakage_notice_breakage
    FOREIGN KEY (breakage_id)
    REFERENCES breakage (id)
        ON DELETE NO ACTION
    ON UPDATE CASCADE;

Триггер приведен выше.
Кроме того, я обьявил исключение:
Код

CREATE EXCEPTION one_to_one_relation
'Violation one-to-one relation';

Для генерации автоинкрементных значений полей id обоих таблиц используются пары генератор-триггер - думаю, что они здесь не актуальны.


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


Чо?
****


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

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



Код

alter table breakage_notice add constraint one_to_one_relation unique (breakage_id )

и баста.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 28.9.2010, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

ALTER TABLE breakage_notice ADD UNIQUE (breakage_id);

INSERT INTO breakage (id) VALUES (1);
1 record(s) was(were) inserted into BREAKAGE

INSERT INTO breakage_notice (breakage_id) VALUES (1);
1 record(s) was(were) inserted into BREAKAGE_NOTICE
INSERT INTO breakage_notice (breakage_id) VALUES (1);
Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values.
violation of PRIMARY or UNIQUE KEY constraint "INTEG_1" on table "BREAKAGE_NOTICE".


Zloxa, нет слов  smile !


--------------------
Слава Україні!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

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

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

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

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

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

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


 




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


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

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