基于另一列的Oracle专栏

时间:2013-09-24 20:00:17

标签: sql oracle

我正在使用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有一种简单的方法可以实现这一目标吗?当某个列发生更改时,是否可以设置触发器来更新行中的其他列?

编辑:示例中的清晰度

2 个答案:

答案 0 :(得分:0)

我第二个Jesse建议使用一个可以返回任何你想要的视图。

但是,如果您确实希望存储它(例如,为了在其上创建索引),您可以使用虚拟列:

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

答案 1 :(得分:0)

您应该搜索有关如何为“更新前”创建触发器的文档。请注意,使用触发器并不总是最佳解决方案,因为它可以达到性能。

编辑*:根据oracle doc,无法使用'AFTER UPDATE'触发器执行更新语句。 (Using Triggers)。 但是,最好在代码中执行此操作,假设您有一个运行在此之上的应用程序。同样,你真的需要存储两次相同的信息吗?