代码之家  ›  专栏  ›  技术社区  ›  user171523

表同步并复制到其他表中

sql
  •  0
  • user171523  · 技术社区  · 16 年前

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

    如果表A到表B和表C中有新的记录,我还需要记录。

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

    4 回复  |  直到 16 年前
        1
  •  2
  •   JYelton Melchior Blausand    16 年前

    以下是我在用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;
    

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

        2
  •  1
  •   Valentino Vranken    16 年前

    很遗憾,您不能使用SSIS(不允许?)因为它是为这种东西建造的。不管怎样,使用纯SQL,您应该能够做到以下几点:如果您的表有一个已创建/更新的时间戳列,那么您可以查询表B中的最高列,并从表A中获取时间戳高于该列的所有记录。 如果没有时间戳可以使用,希望有一个pk,比如int,可以用同样的方式使用。

    希望有帮助? 瓦伦蒂诺。

        3
  •  1
  •   Jason Love    16 年前

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

        4
  •  0
  •   Dwight T    16 年前

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

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