mysql 将在特定日期之后更新/插入的行从一个表复制到另一个表[已关闭]

q3qa4bjr  于 2022-11-21  发布在  Mysql
关注(0)|答案(2)|浏览(119)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

3天前关闭。
Improve this question
我有两个SQL表:table Atable B
最初,我将所有行从table A复制到table B,比如说在date D上。(在date D之后进行)复制到table B。在复制时,我需要检查原始复制的行是否有更新,如果有,用更新的数据替换它。我在两个表中都有created timestampupdated timestamp字段。
简而言之,我需要同时执行更新和插入操作,以便将新数据从一个表复制到另一个表中。

xqnpmsa8

xqnpmsa81#

1.添加一个标志(位列),如默认archived0
将行从table A复制到table B时,请执行:

UPDATE `table A` SET `archived` = 1

因此,您可以找到从未复制到table B的行:

SELECT * FROM `table A` WHERE `archived` = 0;
-- OR:
INSERT INTO `table C`
SELECT * FROM `table A` WHERE `archived` = 0;

不知道你要更新行table A
您要将它们更新为table B还是复制到table C?如果需要,当您修改行时,可以再次将archived更改为0

chhqkbe1

chhqkbe12#

根据您的注解所做的更改:
1.更新table B上先前在table A上有更改的行

UPDATE `table A` a
INNER JOIN `table B` b ON a.id = b.id
SET
  b.X = a.X,
  b.Y = a.Y,
  /* and more columns */
  b.`updated` = a.`updated`
WHERE (b.`updated` IS NULL AND a.`updated` IS NOT NULL) OR b.`updated` <> a.`updated`

1.在table A上插入在Table B上找不到的新行

INSERT INTO `table B`
SELECT * FROM `table A` WHERE `archived` = 0;

1.在table A中将插入的行(步骤2)标记为已存档

UPDATE `table A` SET `archived` = 1;

表格B:

table B上,不会自动设置任何内容:
不是id乘以AUTO_INCREMENT,也不是createdupdated乘以current_timestamp()
例如:

CREATE TABLE `table A` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `X` INT(11) NOT NULL DEFAULT '0',
    `Y` INT(11) NOT NULL DEFAULT '0',
    /* more your columns, */
    `created` TIMESTAMP NOT NULL DEFAULT current_timestamp(),
    `updated` TIMESTAMP NULL DEFAULT NULL ON UPDATE current_timestamp(),
    `archived` BIT(1) NOT NULL DEFAULT b'0',
    PRIMARY KEY (`id`) USING BTREE
);

CREATE TABLE `table B` (
    `id` INT(10) UNSIGNED NOT NULL,
    `X` INT(11) NOT NULL DEFAULT '0',
    `Y` INT(11) NOT NULL DEFAULT '0',
    /* more your columns, */
    `created` TIMESTAMP NULL DEFAULT NULL,
    `updated` TIMESTAMP NULL DEFAULT NULL,
    `archived` BIT(1) NOT NULL,
    PRIMARY KEY (`id`) USING BTREE
);

相关问题