【问题标题】:mysql copy complete row data from one table to another with different fieldsmysql将完整的行数据从一个表复制到另一个具有不同字段的表
【发布时间】:2021-08-03 11:55:25
【问题描述】:

我有一个主表

id       Name       Value
2          A          4
4          A          5
6          B          8
8          C          9

和一个历史表,它是主表的副本,但有一个 history_id

history_id   id       Name       Value
    1        2          A          4
    2        4          A          5
    3        6          B          8
    4        8          C          9

我想要实现的是将主表的行复制到history_table,每当master_table发生变化时

我正在尝试这样做

INSERT INTO history_table
VALUES ('', SELECT * FROM master_table WHERE `id` = 8)

返回我的错误是两个表中的列都不匹配。如果不是,我希望我能正确尝试,然后请建议任务的最佳方法。

P.S:我不想在查询中提及静态列名和值,因为表中有超过 50 多个字段,并且数据库结构中的任何新更改将来都会使查询失败。

【问题讨论】:

  • 简短的回答是你不能。 history_id 显然是一个计算列 (可能是 AUTO_INCREMENT) 并且要填充该表,您将 需要 指定您的列重新插入到。即使没有这样的列,您也应该仍然始终指定列名,因为总是可能一个表定义为a, b, c,另一个定义为c, b, a,在这种情况下,指定名称是将数据放在正确位置的唯一方法。这是XY Problem,您甚至不应该尝试这样做。
  • 主表中的列id是AUTO_INCREMENT吗?
  • @forpas yes.. master 表中的 id 和 history 表中的 history_id 是 AUTO_INCREMENT 主键

标签: mysql sql sql-insert


【解决方案1】:

您应该使用INSERT ... SELECT 而不是INSERT ... VALUES 并通过NULLhistory_id

INSERT INTO history_table
SELECT null, m.* 
FROM master_table m
WHERE m.id = 8;

请参阅demo

【讨论】:

  • 太棒了..这就是我要找的东西,谢谢
【解决方案2】:

您应该列出正在插入的列并使用insert . . . select

INSERT INTO history_table (id, name, value)
    SELECT id, name, value
    FROM master_table
    WHERE `id` = 8;

这假定history_id 是自动设置的(自动递增)。

您的问题是指价值观的变化。但是,这与您指定的错误无关。如果您对检测更改还有其他问题,请提出问题,并提供适当的样本数据、所需结果和解释。

【讨论】:

  • 如果我这样做,那么如果将来更改数据库结构,我的查询将失败。其次,如果我遵循这种方法,那么每次我更改数据库的结构时,我都必须修改我的查询
  • 我不想在查询中指定列名和值
  • @MuhammadAsifRaza 。 . .更改表的结构是数据库中的设计缺陷。
  • @MuhammadAsifRaza - SQL 是强类型的;列数、列名及其数据类型都很重要。如果您的模式非常不稳定,以至于您需要代码与结构无关,那么就大错特错了。至少非常,如果架构是易失性的,那么它应该由具有(或可以读取)描述当前结构的元数据的其他软件管理。这将允许您拥有编写 SQL (所谓的“动态 SQL”) 以完成某些功能的代码。
  • @MuhammadAsifRaza 认为link 会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2016-09-23
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
相关资源
最近更新 更多