2013-09-24 5 views
0

Я использую таблицу оракула. Давайте представим, что у меня есть простая таблица, которая имеет имена и datetimestamps:Колонка Oracle на основе другого столбца

Name Time 
--- --- 
joe 01JAN1970:00:00:01 
jane 04MAR2010:20:55:11 
julie 22DEC1984:11:11:11 

Я хочу добавить третий столбец. Назовем это датой. Я хочу урезать время.

Name Time    Date 
--- ---    --- 
joe 01JAN1970:00:00:01 01JAN1970 
jane 04MAR2010:20:55:11 04MAR2010 
julie 22DEC1984:11:11:11 22DEC1984 

Это может быть сделано достаточно легко с обновлением. Хитрость заключается в том, если кто-то обновляет время Жюли, я хочу ее Дата автоматического обновления, а также:

Name Time    Date 
--- ---    --- 
joe 01JAN1970:00:00:01 01JAN1970 
jane 04MAR2010:20:55:11 04MAR2010 
julie 02OCT1999:22:22:22 02OCT1999 

Есть простой способ сделать это с помощью Oracle 11G? Можно ли настроить триггер для обновления другого столбца в строке при изменении определенного столбца?

Edit: ясность в примере

+8

Я бы не сохранил его в таблице вообще, просто добавьте его в свой запрос, когда вы получите доступ к нему или поместите его в виде. – Jesse

+4

Простой ответ на ваш вопрос - «да». Много информации об этом, если вы ищете «update on trigger». И комментарий 2-го Джесси - нет необходимости в 2-м столбце, если все, что он делает, повторяет столбец «Время» в другом формате. – dispake

+0

Я действительно не согласен с тем, что нет причин иметь второй столбец. Я много раз обнаружил, что гораздо сложнее запросить и намного медленнее получить результаты, если вы пытаетесь получить записи из столбца DATETIME, находящиеся в пределах определенного диапазона дат. Например, если вы хотите получить все записи с 1 января 1970 года, если у вас есть второй столбец DATE, запрос намного проще, без необходимости предложения BETWEEN, и вы можете поместить индекс в столбец DATE, чтобы он быстрее получить результаты тоже. Индекс DATETIME имеет мало значения, если почти все записи имеют уникальные значения. – Jim

ответ

0

Я второй совет Джесси использовать вид, который возвращает все, что вы хотите.

Однако, если вы действительно хотите, чтобы это хранить (например, для того, чтобы создать индекс на нем), вы можете использовать виртуальный столбец:

create table foo 
(
    name varchar(50) not null, 
    time timestamp not null, 
    plain_date generated always as (to_char(time, 'yyyy-mm-dd')) 
); 

В качестве альтернативы вы можете также использовать trunc(time) но будет по-прежнему иметь часть времени в нем - только для 00:00:00. Использование to_char() гарантирует, что вы всегда получите дату в нужном формате.

Вот немного SQLFiddle: http://sqlfiddle.com/#!4/a7f55/2

+0

trunc (time) может быть приемлемым, я просто хочу иметь возможность сортировать по дате, а затем еще один столбец в стороннем программном обеспечении. – aknox

0

Вы должны искать документацию о том, как создавать триггеры для 'перед обновлением. Помните, что использование триггеров не всегда является самым оптимальным решением, так как оно может поразить производительность.

EDIT *: невозможно использовать триггер «ПОСЛЕ ОБНОВЛЕНИЯ» для выполнения инструкции обновления в соответствии с документом oracle. (Using Triggers). Однако было бы лучше сделать это в коде, если у вас есть приложение, работающее поверх этого. Опять же, вам действительно нужно хранить дважды ту же информацию?

+0

Вы можете быть правы, я бы хотел увидеть некоторые ссылки ссылок. Однако можно сделать это с помощью триггера «до обновления», не используя инструкцию «UPDATE», просто присваивая значения: new.variables, похоже, работает. Проблема заключается в том, что это также должно быть реализовано в заявлении «ПЕРЕД НАЗНАЧЕНИЕМ», чтобы быть последовательным. http://www.techonthenet.com/oracle/triggers/before_update.php – schwarz

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