我正在使用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有一种简单的方法可以实现这一目标吗?当某个列发生更改时,是否可以设置触发器来更新行中的其他列?
编辑:示例中的清晰度
答案 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)。 但是,最好在代码中执行此操作,假设您有一个运行在此之上的应用程序。同样,你真的需要存储两次相同的信息吗?