所以,我有一张桌子,例如:
CREATE TABLE FOO (
id INTEGER PRIMARY KEY,
blah VARCHAR2(20) NOT NULL
);
并且我想将列blah
重命名为bleh
- bar
和baz
表中的等效列称为bleh
,并且正在制作跨表的名称统一允许我简化访问此数据库的一些代码。但是,仅使用ALTER TABLE
重命名列将不起作用,因为生成的架构更改向后与不经过修改以匹配它的代码不兼容。
所以,我想这样做,以便我bleh
作为blah
的别名。起初,虚拟列似乎是实现此目的的一种方式:
ALTER TABLE FOO ADD (bleh AS blah);
但是,生成的bleh
列无法更新或插入,这使其不适合我的目的。 有没有办法在Oracle 11gR2中创建可写(可更新/可插入)列别名?
答案 0 :(得分:1)
有两种选择。
选项1是将foo
重命名为foo_base
,在foo
上创建一个视图foo_base
,然后将foo
中的列公开为blah
bleh
视图中有1}}和alter table foo
rename to foo_base;
alter table foo_base
rename column blah to bleh;
create view foo
as
select id, bleh as blah, bleh as bleh
from foo_base;
。
blah
只要您不尝试在同一bleh
声明中更新foo
中的update
和bleh
,我就不会期望这会导致任何问题。
选项2是将update
列添加到表中,然后编写触发器以使两个列在插入或更新行级触发器之前保持同步。这意味着如果00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit object
00000000 00000000 01010000 00000000 //shifted left by 8
语句试图更新两列,数据将被复制并且逻辑会有点痛苦。只要您只更新一个或另一个列,那就应该没问题。
答案 1 :(得分:0)
只需创建一个视图,然后在此视图中为列' blah`定义别名blee
,
然后使用此视图而不是表。
简单示例:
CREATE TABLE FOO (
id INTEGER PRIMARY KEY,
blah VARCHAR2(20) NOT NULL
);
CREATE VIEW foooo as
SELECT id, blah as blee
FROM foo;
insert into foooo( id, blee ) values ( 1, 'aaaa' );
update foooo set blee = 'bbbb' where id = 1;
select * from foo;
ID BLAH
---------- --------------------
1 bbbb