Добавление уникального ограничения на вычисляемое значение столбца - PullRequest
4 голосов
/ 13 июля 2010

Я не совсем уверен, как сформулировать это, но здесь идет ... У нас есть структура таблицы, подобная следующей:

Id   |   Timestamp    | Type  | Clientid   | ..others..
001  |   1234567890   | TYPE1 | CL1234567  |.....    
002  |   1234561890   | TYPE1 | CL1234567  |.....    

Теперь для данных, приведенных выше ... Я хотел быиметь ограничение, чтобы эти 2 строки не могли существовать вместе.По сути, я хочу, чтобы таблица была

Unique for (Type, ClientId, CEIL(Timestamp/10000)*10000)

. Я не хочу, чтобы строки с одинаковыми данными, созданными в течение X времени друг от друга, добавлялись в БД, т.е. хотели бы, чтобы в этом случае нарушалось ограничение,Проблема в том, что вышеупомянутое ограничение не является чем-то, что я действительно могу создать.

Прежде чем вы спросите, я знаю, я знаю .... почему правильно?Я знаю, что определенного сценария не должно быть, но, увы, так оно и есть.Сейчас мне нужна какая-то мера по ограничению разрыва, чтобы я мог выиграть время, чтобы разобраться с фактическим вопросом.Дайте мне знать, если вам нужна дополнительная информация ...

Ответы [ 2 ]

9 голосов
/ 13 июля 2010

Да, Oracle поддерживает вычисляемые столбцы:

SQL> alter table test add calc_column as (trunc(timestamp/10000));

Table altered.

SQL> alter table test
     add constraint test_uniq
     unique (type, clientid, calc_column);

Table altered.

должен делать то, что вы хотите.

1 голос
/ 13 июля 2010

AFAIK, Oracle не поддерживает вычисляемые столбцы, как SQL Server. Вы можете имитировать функциональность вычисляемого столбца с помощью триггеров.

Вот шаги для этого

  1. Добавьте столбец с именем CEILCalculation в вашу таблицу.
    • На вашем столе, поставить триггер, обновится CEILCalculation со значением от CEIL(Timestamp/10000)*10000
    • Создание уникального индекса по трем столбцам (Unique for (Type, ClientId, CEILCalculation)

Если вы не хотите изменять структуру таблицы, вы можете поместить BEFORE INSERT TRIGGER в таблицу и проверить ее на достоверность.

http://www.techonthenet.com/oracle/triggers/before_insert.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...