Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用从case语句派生的列更新视图?_Mysql_Sql_Oracle_Updatable Views - Fatal编程技术网

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列编写更新规则?还是就那个?