【问题标题】:Insert all rows from one table to another + time stamp at the end将一个表中的所有行插入到另一个表中+最后的时间戳
【发布时间】:2011-06-16 14:16:55
【问题描述】:

我正在创建一个与我的活动数据库完全相同的更改日志数据库,只是它末尾有一个更改日期字段。

db 基本上是一个主键 id,以及大约 50 个其他各种数据类型的列。我在 php 中的脚本是它尝试插入新的 id,如果它收到重复主键的错误消息,那么它应该获取该行,将其插入到我的备份数据库中,并使用 curdate() 调用作为最终日期值,从我的第一个数据库中删除条目,然后插入新条目。

我已经完成了脚本的所有其他部分,除了我必须插入第一个表中的所有内容 + curdate() 的额外列的部分。或者,如果有一个更好的解决方案来解决我的问题,即当存在相当多的行时出现重复的主键时插入到备份数据库中,请分享。

【问题讨论】:

  • 你能显示一些代码吗?如果您要覆盖数据库中现有的一组 Col,您需要使用 UPDATE,而不是 INSERT,否则它将失败。至于当前日期,您可以在 mysql 查询中使用“NOW()”
  • 你的意思是删除和插入代码吗?它只是从 id=someid 的表中删除,然后插入表值(等)。更新的一个问题是,如果不明确说明所有列的名称,我无法弄清楚如何更新所有列。
  • 我相信你可以有一个时间戳类型的字段,如果你将NULL传递给它,它会自动获取当前时间戳,我已经4年左右没有使用MySQL了,所以我不确定不再

标签: php mysql


【解决方案1】:

您可以执行 INSERT INTO SELECT:

INSERT INTO `backupTable` SELECT *, NOW() FROM `originalTable` WHERE id = '$id';

您必须为要复制到备份数据库的条目指定ID您还必须确定,ID 尚未在您的备份表中。您可以使用REPLACE INTO 来解决这种情况。

REPLACE INTO `backupTable` SELECT *, NOW() FROM `originalTable` WHERE id = '$id';

【讨论】:

  • 哦,忘了提到备份表的 id 不是主键,因为它更像是一个更改日志而不是备份表,我只需要知道什么时候有新的东西进入。插入应该没问题吧?
【解决方案2】:

基本上,您可以创建一个TIMESTAMP 列,并将CURRENT_TIMESTAMP 作为默认值。 当您在该表中插入一行时,将自动插入当前日期/时间。 那是你要找的吗?

顺便说一句:我建议从源头解决问题,并确保不会将重复的主键插入到数据表中。 为此,您可以使用SELECT LAST_INSERT_ID();

【讨论】:

  • 谢谢,这两种解决方案都有效,但我想要做的是如果出现重复的 id 并且如果它不同,则插入更改日志等。
  • 您将重复的 id 作为错误处理,而首先它不应该得到重复。
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 2015-03-21
  • 2021-10-11
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多