2010-07-13 6 views
2

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

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

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

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

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

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

ответ

8

Да, 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. 

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

+0

Аналогичная проблема, как указано выше, но если мне нужно добавить новый столбец, это будет похоже на путь. Мне нравится идея использования trunc вместо того, что я делал (1 меньше математики). Теперь, чтобы посмотреть, найдет ли db этот копакетический. –

1

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

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

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

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

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

+0

Thx для быстрой информации ... Я тоже думал об этом ... Я бы хотел избежать добавления столбцов и т. Д. И слишком сильно изменить схему. Проблема в том, что таблица является ginormous и часто используется/обновляется. –

Смежные вопросы