Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как обеспечить невозможность вставки данных в обратном порядке


Страницы:   1 2

Игорь Шевченко ©   (2007-09-28 11:59:00) 

Имеется таблица из двух полей (город1, город2)
Требуется обеспечить отсутствие записей с обратным порядком тех же самых городов, если есть запись "Москва","Бобруйск", то запись "Бобруйск","Москва" должно невозможно добавить любым способом.

Вопрос собственно, можно ли объявить такое ограничение на уровне объявления таблицы ?


Reindeer Moss Eater   (2007-09-28 12:49:00) [21]

Ну типа все, кто смог бы ответить и так помнят, что там у них Оракл.
Я например помню.
:)


Игорь Шевченко   (2007-09-28 12:49:00) [22]

Desdechado ©   (28.09.07 12:42) [9]

А я вроде гайку Oracle ставил, когда вопрос задавал...


> >  UNIQUE INDEX foo_ix
> это не
> > ограничение на уровне объявления таблицы


А что это, если не секрет ?


Desdechado   (2007-09-28 12:42:00) [23]

>  UNIQUE INDEX foo_ix
это не
> ограничение на уровне объявления таблицы

И как обычно, СУБД не указано, а далеко не все поддерживают построение индексов по функциям.


Reindeer Moss Eater   (2007-09-28 12:40:00) [24]

>Это как?
Примерно как в последнем параграфе [6].
Зависит от синтаксиса и возможностей сервера


stanislav   (2007-09-28 12:33:00) [25]

Reindeer Moss Eater ©   (28.09.07 12:14) [4]
Это как?


Игорь Шевченко   (2007-09-28 12:31:00) [26]

не должна проходить такая пара команд

INSERT INTO FOO VALUES ('Москва','Бобруйск');
INSERT INTO FOO VALUES ('Бобруйск','Москва');

Выданы эти INSERT'ы могут быть в произвольный момент времени из 1000 сеансов одновременно.

Кстати, решил задачу.

CREATE TABLE foo (
 city1 CHAR(3) NOT NULL,
 city2 CHAR(3) NOT NULL,
 CONSTRAINT fk_foo_city1 FOREIGN KEY (city1) REFERENCES city
   ON DELETE CASCADE,
 CONSTRAINT fk_foo_city2 FOREIGN KEY (city2) REFERENCES city
   ON DELETE CASCADE,
 CONSTRAINT pk_foo PRIMARY KEY (city1,city2)
) ORGANIZATION INDEX;

CREATE UNIQUE INDEX foo_ix ON
 foo (LEAST(UPPER(city1),UPPER(city2))||
   GREATEST(UPPER(city1),UPPER(city2)));


Sergey13   (2007-09-28 12:31:00) [27]

Уникальность на сумму двух контрольных сумм.


Reindeer Moss Eater   (2007-09-28 12:14:00) [28]

или уникальный констрейнт на выражение по двум ключам независящее от перестановки операндов (если там ключи, а не строки).


Desdechado   (2007-09-28 12:09:00) [29]

CHECK place_id1 < place_id2
UNIQUE place_id1, place_id2
И в триггере переставлять при добавлении записи.


Reindeer Moss Eater   (2007-09-28 12:09:00) [30]

Например триггер на бефоинсерт.
Но я бы сделал на клиенте


Anatoly Podgoretsky   (2007-09-28 12:08:00) [31]

Сводится к проверке выборкой - город2, город1


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо