【问题标题】:Is there a way in MySQL to update a view with data from a table that is not covered by the view?MySQL 中有没有办法使用视图未覆盖的表中的数据更新视图?
【发布时间】:2021-12-23 08:25:57
【问题描述】:

我有两个表,test1 和 test2:

test1

| id | name  |
| -- | ----- |
| 1  | Steve |
| 2  | Phil  |
| 3  | Tony  |

test2

| id | name  |
| -- | ----- |
| 4  | Peter |
| 5  | Perry |

我使用代码从 test1 创建了一个视图
CREATE VIEW test_view AS SELECT * from test1;

我希望用来自 test2 的数据更新这个 test_view。

我想要的如下图

| id | name  |
| -- | ----- |
| 1  | Steve |
| 2  | Phil  |
| 3  | Tony  |
| 4  | Peter |
| 5  | Perry |

我希望找到一种方法来做到这一点,而无需加入这两个表。

【问题讨论】:

  • 您要使用UNION 操作/关键字吗?
  • 不,不会。我正在寻找一种方法,首先从表 test1 创建 test_view,然后使用表 test2 中的数据更新 test_view。
  • 更新视图就是销毁和重新创建它,不是吗?
  • 您可能误解了什么是视图。视图只是查询的结果。当您更改基础数据(例如表 test1)时,视图的“内容”会发生变化 - 如果您不更改基础数据(或视图代码,请参阅Ярослав Рахматулин's answer),它不会改变。具体来说,视图不是在您创建视图时数据的副本,或者是保存数据的变量(您可以向其中添加更多数据)或其他东西。实际上,当你这样做时,例如select * from viewname,MySQL 基本上会在你运行 select 时将 viewname 替换为视图的代码。
  • 你是对的。我不明白视图到底是什么。事实上,更新基础数据足以满足我的需求。谢谢你,我为误解道歉

标签: mysql sql-view


【解决方案1】:

您可以使用联合。

create table a (id int, name varchar(255));
create table b (id int, name varchar(255));


insert into a values (1, "c"), (2, "d");
insert into a values (5, "zz"), (6, "ff");
insert into b values (1, "a"), (2, "b");

create view c as select * from a union select * from b;

select  * from c;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    1 | c    |
|    2 | d    |
|    5 | zz   |
|    6 | ff   |
+------+------+

【讨论】:

    【解决方案2】:

    根据 Solarflare -

    视图只是查询的结果。视图的“内容”发生了变化 当您更改基础数据(例如表 test1)时 - 它 如果您不更改基础数据,则不会更改

    所以,当我执行 test1 = test1.append(test2) 时,我从底层 test1 数据帧创建的 test_view 会自动更新。

    【讨论】:

      猜你喜欢
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 2015-09-10
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多