将数据插入数据库的精确副本

时间:2017-07-17 21:45:50

标签: sql sql-server

我有两个数据库..完全相同的结构和"几乎"所有这些都是重复的数据。但是我在database1中更新了需要进入database2的记录。现在是否有一种简单的方法可以将所有新数据从database1推送到database2,而无需获取重复记录?

注意我不知道有多少\哪些表更新了数据。

编辑:没有"修改"数据行只是" new"数据行

2 个答案:

答案 0 :(得分:0)

你有很多选择。

如果您的表格值为'主键不需要更新,我可能会建议REPLACE INTO

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | Old  | 2014-08-20 18:47:00 |
+----+------+---------------------+
1 row in set (0.00 sec)    

然后:

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)

# (Example Straight from the MySQL AB)

您可以将整个操作包装在TRANSACTION

OP修改后:如果REPLACE INTO找不到要更新匹配主键的候选行,则INSERT INTO只会mysqldump --replace --no-create-info database1 | mysql database2 使用此功能。

要执行此流式传输mysqldump,您可以:

INSERT ... ON DUPLICATE IGNORE

或者更简单的mysqldump --insert-ignore --no-create-info database1 | mysql database2 ,因为您实际上并不需要更新行:

public function isMale()
{
    if($this->gender == 0) {
        $myGender =  "Male";
    }
    else {
        $myGender = "Female";
    }

    return $myGender;
}

答案 1 :(得分:0)

来自Microsoft网站: https://docs.microsoft.com/en-us/sql/relational-databases/replication/types-of-replication

Microsoft SQL Server提供以下类型的复制以在分布式应用程序中使用:

  • 交易复制。有关更多信息,请参阅Transactional 复制。
  • 合并复制。有关更多信息,请参阅合并复制。
  • 快照复制。有关更多信息,请参阅快照
    复制。

为应用程序选择的复制类型取决于许多因素,包括物理复制环境,要复制的数据的类型和数量以及是否在订阅服务器上更新数据。物理环境包括复制中涉及的计算机的数量和位置,以及这些计算机是客户端(工作站,笔记本电脑或手持设备)还是服务器。

每种类型的复制通常从发布者和订阅者之间的已发布对象的初始同步开始。可以通过使用快照进行复制来执行此初始同步,快照是发布指定的所有对象和数据的副本。创建快照后,它将传递给订阅服务器。对于某些应用程序,只需要快照复制。对于其他类型的应用程序,随后的数据更改必须随着时间的推移逐步流向订阅服务器。某些应用程序还要求更改从订阅服务器返回到发布服务器。事务复制和合并复制为这些类型的应用程序提供了选项。

快照复制不会跟踪数据更改;每次应用快照时,它都会完全覆盖现有数据。事务复制通过SQL Server事务日志跟踪更改,合并复制通过触发器和元数据表跟踪更改。

一些教程:https://docs.microsoft.com/en-us/sql/relational-databases/replication/replication-tutorials