Mysql 如何使用从case语句派生的列更新视图?
我使用忽略的其他列创建了一个视图:Mysql 如何使用从case语句派生的列更新视图?,mysql,sql,oracle,updatable-views,Mysql,Sql,Oracle,Updatable Views,我使用忽略的其他列创建了一个视图: create view view_table (is_root) as select case when C1 = 'Yes' then 1 when C1 = 'No' then 0 else 0 end as is_root from remote_db_table 但当我尝试使用以下工具更新视图时: update view_table set is_root=1 它不起作用。有办法吗?视图在Oracle中,但远
create view view_table (is_root) as select
case when C1 = 'Yes' then 1
when C1 = 'No' then 0
else 0
end as is_root
from remote_db_table
但当我尝试使用以下工具更新视图时:
update view_table set is_root=1
它不起作用。有办法吗?视图在Oracle中,但远程表在mySQL中,我相信您的尝试是不可能的。虽然MySQL允许对视图执行update语句,但is_root是一个派生列,因此更新它没有意义,因为没有返回表的路径 我相信你的尝试是不可能的。虽然MySQL允许对视图执行update语句,但is_root是一个派生列,因此更新它没有意义,因为没有返回表的路径 您可以在Oracle中通过构建视图来实现这一点
create or replace trigger vt_instead
instead of update on view_table
begin
if :new.is_root != :old.is_root
then
update remote_db_table
set C1 = case when :new.is_root = 1 then 'Yes'
else 'No' end
where id = :new.id;
end if;
end;
/
这将允许您针对视图发布更新,该更新将把更改传播到基础视图:
update view_table
set is_root = 0
where id = 23
/
我还没有针对MySQL数据库上的远程表测试过这一点,但如果您可以在SQL*Plus中远程更新表,那么触发器也应该可以工作
我想更新所有的40列,但只有一列没有更新
如上所述可更新
恐怕你还没有完全弄清楚,但我想你问的是如何处理不需要翻译的专栏
INSTEAD OF触发器触发而不是触发DML语句。线索在名称中。这意味着您需要处理希望通过视图更新的所有列。在您的场景中,这将是全部四十列。修改后的触发器
代码可能如下所示:
create or replace trigger vt_instead
instead of update on view_table
begin
update remote_db_table
set C1 = case when :new.is_root = 1 then 'Yes'
else 'No' end
, C2 = :new.col2
, C3 = :new.col3
, C4 = :new.col4
....
, C40 = :new.col40
where id = :new.id;
end;
/
无法通过视图更新表update语句中未包含的任何列 您可以在Oracle中通过构建视图来实现这一点
create or replace trigger vt_instead
instead of update on view_table
begin
if :new.is_root != :old.is_root
then
update remote_db_table
set C1 = case when :new.is_root = 1 then 'Yes'
else 'No' end
where id = :new.id;
end if;
end;
/
这将允许您针对视图发布更新,该更新将把更改传播到基础视图:
update view_table
set is_root = 0
where id = 23
/
我还没有针对MySQL数据库上的远程表测试过这一点,但如果您可以在SQL*Plus中远程更新表,那么触发器也应该可以工作
我想更新所有的40列,但只有一列没有更新
如上所述可更新
恐怕你还没有完全弄清楚,但我想你问的是如何处理不需要翻译的专栏
INSTEAD OF触发器触发而不是触发DML语句。线索在名称中。这意味着您需要处理希望通过视图更新的所有列。在您的场景中,这将是全部四十列。修改后的触发器
代码可能如下所示:
create or replace trigger vt_instead
instead of update on view_table
begin
update remote_db_table
set C1 = case when :new.is_root = 1 then 'Yes'
else 'No' end
, C2 = :new.col2
, C3 = :new.col3
, C4 = :new.col4
....
, C40 = :new.col40
where id = :new.id;
end;
/
无法通过视图更新表update语句中未包含的任何列 这是MySQL还是Oracle视图?@rontornanbe抱歉,我应该更正它。这是Oracle中的一个视图,但远程表在MySQL中。这是MySQL还是Oracle视图?@rontornanbe抱歉,我应该更正它。这是Oracle中的一个视图,但远程表在MySQL中。在MySQL中可能不可能,但在Oracle中有一种方法可以做到这一点,在MySQL中可能不可能,但在Oracle中有一种方法可以做到这一点,很好的解决方案;看起来MySQL视图/触发器提供了相同的解决方案,如果有人希望这样做:假设表中有40列。我应该为每一列编写更新规则吗?或者只是列不可更新?@texasbruce-这取决于您是否希望通过视图更新特定列。根据您的业务规则,任何一个选项都是对的或错的。@APC我的意思是我想更新全部40列,但只有一列不能像上面那样更新。创建触发器时,是否必须为所有40列编写更新规则?还是只有一个?很好的解决方案;看起来MySQL视图/触发器提供了相同的解决方案,如果有人希望这样做:假设表中有40列。我应该为每一列编写更新规则吗?或者只是列不可更新?@texasbruce-这取决于您是否希望通过视图更新特定列。根据您的业务规则,任何一个选项都是对的或错的。@APC我的意思是我想更新全部40列,但只有一列不能像上面那样更新。创建触发器时,是否必须为所有40列编写更新规则?还是就那个?