【问题标题】:Compare MANY columns in MySQL?比较 MySQL 中的许多列?
【发布时间】:2017-11-07 07:04:56
【问题描述】:

我有一个表,其中包含一些用于特定目的的非规范化数据(不要问),所以它有几百列。有一个主键。

此表每周更新一次,但大多数 id:s 将具有与前一周相同的数据。

现在,我需要将所有记录版本存储在历史表中,即如果第 N 周添加了 id X 的记录,则第 N+1 周没有变化,但有些数据在第 N+2 周和第 N+3 周发生了变化,那么历史记录表应包含三个记录:第 N、N+2 和 N+3 周的记录。

编写适当的insert 查询在技术上很容易,但它会涉及到每一列的比较,所以这将是一个很长的 SQL 查询。我确信它会起作用,但是......

在 MySQL 中是否有任何方法可以比较所有列而无需为每列显式写入 ...or t1.col1 <> t2.col1...? IE。 ...t1.allcolumns <> t2.allcolumns... 之类的,比如一次性比较整行?

我很确定答案是否定的,但是... :-)

【问题讨论】:

  • 设计您的架构的人考虑的是电子表格,而不是关系数据库;这就是让你的生活变得悲惨的原因。也许是时候使用EAV schema 重新实现数据库了?
  • 它是为了特定目的而需要它是它的方式。我不会讨论它,因为它很长而且离题。

标签: mysql sql sql-insert


【解决方案1】:

您可以编写一个程序(使用您最喜欢的编程语言)来构建查询。该程序将在数据库模式中查找,找到表的所有列,并从中构造查询。我认为在纯 SQL 中不可能做到这一点,但即使可能,纯 SQL 也可能是错误的工具。

【讨论】:

  • 是的,当然。可以通过几种不同的方式生成正确的 SQL。我可能会根据表格的 DML 在 Notepad++ 中使用键盘宏。感谢您的想法,但并没有真正解决问题(避免庞大的 SQL)。
【解决方案2】:

您可以使用行值语法,但您仍然必须命名所有列:

(t1.col1, t1.col2, ...) <> (t2.col1, t2.col2, ...)

【讨论】:

  • 啊,这可能很有趣。会查查,尤其是它如何对待null
  • null 的处理由&lt;&gt; 操作符完成。 null 不被视为&lt;&gt;null(比较的结果是unknown)。如果您希望 null 被视为与 null 相同,则必须使用 &lt;=&gt; 运算符 not (...) &lt;=&gt; (...)(从未使用过,希望它有效):dev.mysql.com/doc/refman/5.7/en/…
【解决方案3】:

更新 1

看看这个:https://www.techonthenet.com/mysql/intersect.php

  1. 相交 t1 和 t2。结果 = 两个表上的行。
  2. 从 t1 中选择所有不在相交结果中的恶魔。

抱歉,缺少代码,我没有时间详细说明,但就是这样。

【讨论】:

  • 不是真的,我想。我不需要获取不同的行,而是插入在t2 中没有相同记录的t1 记录。如果您看到使用 distinct 的方法,请详细说明。
  • @KjellRilbe 我更新了答案,反映了您对评论的要求。
  • 谢谢,“相交”和“不在”需要比较所有字段,不是吗?这就是我的问题 - 如何避免对所有字段进行显式比较。您之前使用 distinct 的建议确实可以避免这种情况,但我看不到如何使用它将 t1 记录插入到 t2 中,这些记录不存在。
  • w3schools.com/sql/sql_select_into.asp --> SELECT INTO t2 FROM (SELECT [...] INTERSECT [...])
  • @KjellRilbe 请让我知道该答案是否解决了您的问题,并将适合您的任何答案标记为最终接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多