表同步并复制到另一个表中

时间:2010-05-14 19:57:13

标签: sql

我有两张桌子。表A和表B.它们是相同的。在10分钟内,我需要检查表A中是否有任何变化(新的和更新的)并复制到表B中。如果我看到差异和新的,还要输入表C.

我还需要记录表A到表B和表C中是否有任何新记录

我打算加入并比较记录。如果我这样做,我可能会错过新的记录。有没有更好的方法来进行这种同步。它必须在SQL中完成,我不能使用任何其他工具,如SSIS。

4 个答案:

答案 0 :(得分:2)

以下是我在SQL中制作一些简单表格时的想法:

# create some sample tables and data
DROP TABLE alpha;
DROP TABLE beta;
DROP TABLE charlie;

CREATE TABLE `alpha` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `data` VARCHAR(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=latin1;

CREATE TABLE `beta` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `data` VARCHAR(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=latin1;

CREATE TABLE `charlie` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `data` VARCHAR(32) DEFAULT NULL,
  `type` VARCHAR(16) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=latin1;

INSERT INTO alpha (data) VALUES ("a"), ("b"), ("c"), ("d"), ("e");
INSERT INTO beta (data) VALUES ("a"), ("b"), ("c");

# note new records of A, log in C
INSERT INTO charlie (data, type)
    (SELECT data, "NEW"
    FROM alpha
    WHERE id NOT IN
        (SELECT id
        FROM beta));

# insert new records of A into B
INSERT INTO beta (data)
    (SELECT data
    FROM alpha
    WHERE id NOT IN
        (SELECT id
        FROM beta));

# make a change in alpha only
UPDATE alpha
SET data = "x"
WHERE data = "c";

# note changed records of A, log in C
INSERT INTO charlie (data, type)
    (SELECT alpha.data, "CHANGE"
    FROM alpha, beta
    WHERE alpha.data != beta.data
    AND alpha.id = beta.id);

# update changed records of A in B
UPDATE beta, alpha
SET beta.data = alpha.data
WHERE alpha.data != beta.data
AND alpha.id = beta.id;

你当然必须根据数据类型,字段数等扩展它,但如果它有帮助,这是一个基本概念。

答案 1 :(得分:1)

很遗憾你不能使用SSIS(不允许?),因为它是为这种东西而构建的。无论如何,使用纯SQL你应该能够得到如下内容:如果你的表有一个创建/更新的时间戳列,那么你可以查询表B中的最高值,并从表A获取时间戳高于那一个的所有记录。 如果没有时间戳可以使用,希望有一个类似于int的PK可以以相同的方式使用。

希望有帮助吗? 瓦伦蒂诺。

答案 2 :(得分:1)

我会尝试使用触发器或事务复制。

答案 3 :(得分:0)

希望你有一个很好的表中使用的唯一键。要获取新记录,您可以执行以下操作:

SELECT * FROM  tableA
WHERE NOT EXISTS( SELECT * FROM tableB WHERE pkey.tableA = pkey.TableB)