【问题标题】:Update n rows from a table to n rows in another table (no foreign key)将一个表中的 n 行更新为另一个表中的 n 行(无外键)
【发布时间】:2021-04-28 13:12:25
【问题描述】:

我有 2 张桌子,table_1table_2table_1 包含我需要更新到 table_2 的所有数据。

table_1

column_2 column_3
b1 b1
b2 b2

table_2

column_1 column_2 column_3 column_4
1 a1 a1 a
2 a a a
2 a a a
1 a2 a2 a
2 a a a

我需要将table_1 的所有数据放到table_2 中,其中column_1 是一个特定的数字,例如1。但是,我没有任何外键来连接这两个表。唯一的关系是table_1 有n 行,table_2 也有n 行column_1 = 1,我希望table_1 中的n 行更新为table_2 中的这n 行。 我的结果如下所示:

column_1 column_2 column_3 column_4
1 b1 b1 a
2 a a a
2 a a a
1 b2 b2 a
2 a a a

任何帮助将不胜感激。

【问题讨论】:

  • 您需要加入每个表的row_number()。但老实说,这听起来像是一个糟糕的桌子设计。请提供更多信息...
  • 我正在使用 phpmyadmin。 table_2 是一个带有主键 id、用户名、user_id 的真实表。 table_1 只是我导入数据库的 csv 文件,因此我不必手动编辑 table_2 的每一行。更新完成后我会删除table_1,所以表结构设计得比平时松散很多。

标签: mysql sql sql-update


【解决方案1】:

目前还不清楚您希望 table1 中的哪些行更新 table2 中的哪些行。我假设您只想按顺序排列:第 1 行到第 1 行、第 2 到第 2 行等。

我们可以做的是给每个表添加一个row_number(),然后加入它。

我不是 100% 了解 MySQL 语法,但希望您能明白这一点。另请参阅here 了解更多“通过连接更新”语法:

WITH t2 AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
    FROM table_2
    WHERE column_1 = 1
),
t1 AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
    FROM table_1
)
UPDATE t2
SET
    t2.column_2 = t1.column_2,
    t2.column_3 = t1.column_3
INNER JOIN t1 ON t1.rn = t2.rn;

如果您无法对WITH 表进行更新,那么您必须自加入table2。你没有注明那张桌子的PK,我就用PK列:

UPDATE table_2
SET
    table_2.column_2 = t1.column_2,
    table_2.column_3 = t1.column_3
INNER JOIN (
    SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
    FROM table_2
    WHERE column_1 = 1
) AS t2 ON t2.PK = table_2.PK
INNER JOIN (
    SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
    FROM table_1
)AS t1 ON t1.rn = t2.rn;

【讨论】:

  • 不幸的是,我正在使用的 mysql 版本不支持WITH-clause。我无权更新 mysql 版本。你说的逻辑正是我想要的。
  • 好的,我给了你另一种你可以使用的语法。如果这不起作用,请在谷歌上搜索“MySQL update with join”
  • 在意识到我的 mysql 版本不支持 row_number() 之后,我使用了一种解决方法并稍微更改了查询。语法正确,但查询不影响任何行。我做了一个 sqlfiddle here 以获得更多解释。我确实理解你的逻辑,因此我不明白为什么它不起作用。
【解决方案2】:

我认为您应该尝试使用脚本语言而不是使用 sql 来做到这一点。 将 from table2 where column_1=1 order by column_2 的所有内容放入对象数组中,例如

[
 {column_1: 1, column_2: b1, column_3: b1, column_4: a},
 {column_1: 1, column_2: b2, column_3: b2, column_4: a}
]

然后在对象数组中获取所有from table1 order by column_2

[
 {column_1: b1, column_2: b1},
 {column_1: b2, column_2: b2}
]

对于 table1 中的每个元素,使用 where qlause 中的 column_1、column_2、column_3、column_4 更新 table2

我认为没有其他方法可以做到这一点……如果结构是这样的,那真的很痛苦

【讨论】:

  • 我希望尽可能避免使用脚本语言,因为我正在向刚学习 phpmyadmin 的新初学者提供指导。不幸的是我没有足够的时间自己管理数据库,所以我只需要告诉他们“将这一行写入 SQL 查询并按 Go”,类似这样。
猜你喜欢
  • 2011-03-04
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
相关资源
最近更新 更多