Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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如何从一个表自动更新另一个表?_Mysql_Database - Fatal编程技术网

MYSQL如何从一个表自动更新另一个表?

MYSQL如何从一个表自动更新另一个表?,mysql,database,Mysql,Database,如果我有两张桌子。表1和表2。表1是允许用户输入值的“输入表”。表2是根据表1中的输入生成答案的“输出表” user ID | Number 1 | 1 2 | 2 3 | 3 user ID | Number 1 | 1 2 | 2 3 | 3 4 | 4 5 | 5 6 | 6 user

如果我有两张桌子。表1和表2。表1是允许用户输入值的“输入表”。表2是根据表1中的输入生成答案的“输出表”

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
表1:

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
假设表2取表1中的值并乘以2。所以表2应该是

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number
1       |   2       
2       |   4    
3       |   6
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
现在,如果我更新表1,它会变成

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
表1:

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
如何在MySQL中获得表2中的自动更新?

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
我期望的表2结果:

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
表2:

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12

假设表2已经存在,是否有方法在更新表1时使用触发器删除当前表2并创建新表2?

您可以创建触发器,在更新表1中的列时更新表2的列(编号)

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
下面是原型

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
CREATE OR REPLACE TRIGGER your_trigger_name
    BEFORE UPDATE ON Order
    FOR EACH ROW 
BEGIN
   //Fetch each row of Col Number of Table 2 in loop using a cursor and update/set its value.

select number into var_x from table 2 .
       UPDATE Table 2 
       set number = :2*var_x ;

    end if;
END;

你需要在更新后使用触发器

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
创建触发器触发器名称 在表1上插入或更新后 每行 开始 插入到表2中(new.userid,new.Number*2);
结束

当然,您可以使用触发器,但在这种情况下,触发器是完全不必要的。它们很难管理和更改,因此,除非您需要以SQL无法实现的方式处理输入数据(例如,您需要执行某些第三方软件),否则最好创建一个视图

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
视图是一种特殊类型的表,定义为对现有数据的SQL查询。在提供的示例中,您可以通过运行以下命令来创建这样的表:

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
CREATE VIEW table2 AS
    SELECT userId, number * 2 as number FROM table1;
这里,我们指示数据库创建一个名为table2的视图或虚拟表,其内容定义为select查询的结果

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
要访问输出数据,您只需运行:

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12
SELECT * FROM table2;
更好的是,无论您如何更改表1的数据(通过插入、更新或删除),视图都将反映这些更改。如果您决定更改表1的结构,只要它仍然包含userID和number属性,就没有问题。如果您决定需要表2中包含更多(或更少)的数据,只需删除此视图并创建一个新视图,而不会丢失数据

user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12

另请参见。

如果设置了键,请查看更新级联上的
如果未使用
触发器,则第二个表应为视图。因为您重用了表,而不是删除并重新创建它,所以只需使用TRUNCATE。
user ID | Number
1       |   1
2       |   2
3       |   3
user ID | Number    
1       |    1    
2       |    2    
3       |    3    
4       |    4    
5       |    5    
6       |    6
user ID | Number    
1       |    2    
2       |    4    
3       |    6    
4       |    8    
5       |    10    
6       |    12