【问题标题】:Mysql TRIGGER sync 2 databases same serverMysql TRIGGER 同步 2 个数据库同一个服务器
【发布时间】:2018-01-30 11:16:47
【问题描述】:

mysql 5.6.37 phpmyadmin 4.4.15.7 同一台服务器

TRIGGER 在 database_2 中创建 它应该从 database_1 中的更新同步 database_2

DELIMITER |
USE database_2;
CREATE TRIGGER trgSync 
AFTER UPDATE ON database_1.table_1
FOR EACH ROW
BEGIN
UPDATE database_2.table_1 a INNER JOIN database_1.table_1 b USING(tb_id)
SET 
a.published = b.published;
END;

我明白了

1064 - 您的 SQL 语法有错误...在第 2 行的“CREATE TRIGGER trgSync AFTER UPDATE ON ...”附近

感谢您的帮助

【问题讨论】:

  • 我怀疑您可以将触发器存储在表所在的数据库之外的数据库中。
  • 在同一台服务器上是可能的,但我找不到方法
  • 嗯,当我尝试复制这个时,我在错误的架构错误中触发
  • 然后更改 USE database_2;用你的数据库
  • 第2行USE database_2|你试过了吗?而不是分号,因为上一行将 DELIMITER 设置为 |字符。

标签: mysql triggers


【解决方案1】:

除了关于如何使用分隔符的问号之外,如果您尝试将触发器停放在正确的架构中,则触发器很好。希望这段代码对你有足够的说服力

MariaDB [sandbox]> use sandbox;
Database changed
MariaDB [sandbox]> drop trigger if exists trgsync;
Query OK, 0 rows affected (0.01 sec)

MariaDB [sandbox]> select table_schema,table_name from information_schema.tables where table_name = 'users' and table_schema in('sandbox','test');
+--------------+------------+
| table_schema | table_name |
+--------------+------------+
| sandbox      | users      |
| test         | users      |
+--------------+------------+
2 rows in set (0.00 sec)

MariaDB [sandbox]> select trigger_schema,trigger_name from information_schema.triggers where trigger_name = 'trgsync';
Empty set (0.04 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> DELIMITER |
MariaDB [sandbox]> CREATE TRIGGER trgSync
    -> AFTER UPDATE ON sandbox.users
    -> FOR EACH ROW
    -> BEGIN
    -> UPDATE test.users a INNER JOIN sandbox.users b USING(id)
    -> SET
    -> a.name = b.name;
    -> END |
Query OK, 0 rows affected (0.02 sec)

MariaDB [sandbox]> delimiter ;
MariaDB [sandbox]>
MariaDB [sandbox]> select trigger_schema,trigger_name from information_schema.triggers where trigger_name = 'trgsync';
+----------------+--------------+
| trigger_schema | trigger_name |
+----------------+--------------+
| sandbox        | trgSync      |
+----------------+--------------+
1 row in set (0.03 sec)

MariaDB [sandbox]> select id,name from sandbox.users union all select id,name from test.users;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbbb |
|  3 | zzz  |
|  1 | aaa  |
|  2 | bbbb |
|  3 | zzz  |
+----+------+
6 rows in set (0.00 sec)

MariaDB [sandbox]> update sandbox.users set name = 'aaaa' where id = 1;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [sandbox]> select id,name from sandbox.users union all select id,name from test.users;
+----+------+
| id | name |
+----+------+
|  1 | aaaa |
|  2 | bbbb |
|  3 | zzz  |
|  1 | aaaa |
|  2 | bbbb |
|  3 | zzz  |
+----+------+
6 rows in set (0.00 sec)

如果您尝试将其停放在错误的架构中

MariaDB [sandbox]> use sandbox;
Database changed
MariaDB [sandbox]> drop trigger if exists trgsync;
Query OK, 0 rows affected (0.01 sec)

MariaDB [sandbox]> select table_schema,table_name from information_schema.tables where table_name = 'users' and table_schema in('sandbox','test');
+--------------+------------+
| table_schema | table_name |
+--------------+------------+
| sandbox      | users      |
| test         | users      |
+--------------+------------+
2 rows in set (0.00 sec)

MariaDB [sandbox]> select trigger_schema,trigger_name from information_schema.triggers where trigger_name = 'trgsync';
Empty set (0.05 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> DELIMITER |
MariaDB [sandbox]> use test;
ERROR 1049 (42000): Unknown database 'test;'
MariaDB [sandbox]> CREATE TRIGGER trgSync
    -> AFTER UPDATE ON sandbox.users
    -> FOR EACH ROW
    -> BEGIN
    -> UPDATE test.users a INNER JOIN sandbox.users b USING(id)
    -> SET
    -> a.name = b.name;
    -> END |
Query OK, 0 rows affected (0.01 sec)

命令行返回一个未知的数据库错误,我的 gui(heidisql) 在错误的架构错误中返回一个触发器。

【讨论】:

  • 感谢您的宝贵时间!我会试着用它做点什么
猜你喜欢
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
相关资源
最近更新 更多