![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обеспечить невозможность вставки данных в обратном порядке
Игорь Шевченко © (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