同步来自两个不同数据库的两个表,具有不同的结构 MySql

时间:2021-02-07 19:11:31

标签: mysql

我有两个处理相同产品的 php 应用程序,一个是购物,另一个是销售点,但每个应用程序都使用自己的数据库。

由于他们都处理相同的产品,我想通过同步 2 dbs 中的产品表来缩短输入产品数据所用的时间,因此当我在商店中添加新产品时,它会显示在 POS 中。

我搜索了很多,但所有结果都在讨论相同的表结构。

不幸的是,在我的情况下,结构不同。

店铺产品表是这样的:

id    name    current_stock  category_id   brand_id

POS 产品表是这样的:

id   name    code    category_id   brand_id

还有一个问题,pos db中的代码列应该包含一个唯一的数字,我使用这个命令来生成它:

`code` =  FLOOR(1000 + RAND() * 89999999)

我需要在同步过程中生成它。

我看到了这个和许多其他帖子 how to copy only distinct values from one table to another in Mysql? 这是关于相同的表

编辑: 起初我会添加所有产品,但之后我只需要添加较新的产品。 这就是我所说的同步

1 个答案:

答案 0 :(得分:1)

我假设两个表都在同一个 mysql 服务器中,并且您的 mysql 用户帐户具有访问两者的正确权限。

INSERT INTO database_pos.pos_product 
        SELECT id, name, 
               FLOOR(1000 + RAND() * 89999999) as code,
                 category_id, brand_id FROM database_shop.shop_product;
<块引用>

我不建议使用 FLOOR(1000 + RAND() * 89999999) 生成唯一键。

此语句将查询shop product表中的所有数据,然后将其插入到POS product表中。根据您的架构更改表和数据库名称。

但正如@stickybit 所暗示的那样。如果可能,我还建议您将两个表移到同一个数据库中。

此外,您可以实现一个触发器来自动执行此操作。

编辑: 添加不在表中的记录。您只需从商店产品表中选择那些记录。

使用子查询获取集合差异,

INSERT INTO database_pos.pos_product 
    SELECT id, name, 
           FLOOR(1000 + RAND() * 89999999) as code,
           category_id, brand_id FROM database_shop.shop_product sp
        WHERE sp.id NOT IN (SELECT id FROM database_pos.pos_product);

使用外连接获取集差,

INSERT INTO database_pos.pos_product 
    SELECT sp.id, sp.name, 
           FLOOR(1000 + RAND() * 89999999) as code,
           sp.category_id, sp.brand_id FROM database_shop.shop_product sp
    LEFT JOIN database_pos.pos_product pp ON pp.id = sp.id
           WHERE pp.id IS NULL;

Subquery vs Join

Mysql triggers tutorial

Mysql triggers official doc

谢谢!

相关问题