我有两张桌子。表A和表B.它们是相同的。在10分钟内,我需要检查表A中是否有任何变化(新的和更新的)并复制到表B中。如果我看到差异和新的,还要输入表C.
我还需要记录表A到表B和表C中是否有任何新记录
我打算加入并比较记录。如果我这样做,我可能会错过新的记录。有没有更好的方法来进行这种同步。它必须在SQL中完成,我不能使用任何其他工具,如SSIS。
答案 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)