【问题标题】:Merge a specific table column from one database to another将特定表列从一个数据库合并到另一个
【发布时间】:2014-10-05 14:29:25
【问题描述】:

我有两个 SQL 数据库。一个是另一个的旧备份。

我只想使用 ssh 或 phpMyAdmin 将 [user_database0] 中的 1 个特定表合并到 [user_database1] 中。

我想从备份中恢复的那个表叫做 [prefix_table]。

但是,我不想恢复该表 [prefix_table] 中的所有列,只恢复 [comment] 列。


我最担心的一个问题是 [prefix_table] 中的某些行已被删除,我不想从旧数据库中恢复那些已删除的行。

这是一个例子:

*- 从 [user_database0] 合并表 [prefix_table]:

                      prefix_table                  
+---------------------------------------------------+
|     id     | name  | comment    | age | person_id |
+++++++++++++++++++++++++++++++++++++++++++++++++++++
| 1111       | name1 | old text 1 | 01  | 001       |
+------------+-------+------------+-----+-----------+
| 2222       | name2 | old text 2 | 02  | 002       |
+------------+-------+------------+-----+-----------+
| 3333       | name3 | old text 3 | 03  | 003       |
+------------+-------+------------+-----+-----------+
| 4444       | name4 | old text 4 | 04  | 004       |
+------------+-------+------------+-----+-----------+

*-进入[user_database1]中的表[prefix_table]:

                       prefix_table                   
+-----------------------------------------------------+
|     id     | name    | comment    | age | person_id |
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
| 1111       | namenew | new text 1 | 99  | 001       |
+------------+---------+------------+-----+-----------+
| 4444       | name4   | new text 4 | 04  | 004       |
+------------+---------+------------+-----+-----------+
| 5555       | name5   | text 1     | 05  | 005       |
+------------+---------+------------+-----+-----------+
| 6666       | name6   | text 2     | 06  | 006       |
+------------+---------+------------+-----+-----------+

*- 结果数据库[user_database1]

                       prefix_table                   
+-----------------------------------------------------+
|     id     | name    | comment    | age | person_id |
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
| 1111       | namenew | old text 1 | 99  | 001       |
+------------+---------+------------+-----+-----------+
| 4444       | name4   | old text 4 | 04  | 004       |
+------------+---------+------------+-----+-----------+
| 5555       | name5   | text 1     | 05  | 005       |
+------------+---------+------------+-----+-----------+
| 6666       | name6   | text 2     | 06  | 006       |
+------------+---------+------------+-----+-----------+

所以它基本上必须检查表 [prefix_table] 是否在两个数据库中匹配,然后覆盖 [comment] 列中的数据。请注意,如果其他列数据发生更改,则应保持原样,仅应更新 [comment]。


总结(两个数据库在同一个服务器上的一个 phpMyAdmin 帐户)

FROM:[user_database0].[prefix_table].[content]

到:[user_database1].[prefix_table].[content]

IF: [id] 列在两个表中都匹配。


这是来自以下建议的工作版本

UPDATE
  [new_db_name].[table_name]
INNER JOIN 
  [old_db_name].[table_name]
ON 
  [new_db_name].[table_name].[column name] = [old_db_name].[table_name].[column name]
SET 
  [new_db_name].[table_name].[matching column name] = [new_db_name].[table_name].[matching column name]

【问题讨论】:

  • 合并是什么意思 - 仅更新列 comments 两个表之间匹配或从备份中插入缺失的行?
  • 对不起,我的术语在这里可能是错误的,但我只是想在发生 id 匹配时替换旧数据库中的“cmets”列数据。不插入新行。目前正在测试下面的解决方案,看看是否可行。
  • 那么下面的回答就可以了
  • 不幸的是,下面的答案对我不起作用...由于 phpMyAdmin 中可能存在不同的语法?
  • 您也用mysql 标记了问题,但您显示的语法是特定于 SQL Server 的。你到底在用什么?

标签: mysql sql phpmyadmin


【解决方案1】:

以下将起作用。在这里,它使用旧评论更新新评论,以获取两者中任何匹配的 ID。

编辑:这应该为您指明正确的方向。我以前有你的架构,我误解了你写的 - 我的错。

UPDATE [new_table_name] SET comment = [old_table_name].onecomment
  FROM [new_table_name]
  INNER JOIN [old_table_name] ON [new_table_name].aboutme_id = [old_table_name].aboutme_id

注意:上面的语法是 SQL Server,因为问题最初被错误地标记为

【讨论】:

  • 感谢您的回答。我仍然在尝试测试它时遇到了一些麻烦,并且不断收到以下错误:(screencast.com/t/yj2NTIhwbeL)。我尝试用相关且不同的数据库替换所有内容,但错误是相同的。另外,我没有看到两个数据库中的实际表名是“tb_aboutme”,这不应该是查询的一部分吗?
  • dbold 是否代表数据库所有者,就像数据库用户一样?您的示例中的“dbnew”是什么?
  • 抱歉,有点混乱…… [new_table_name] 你是说 [new_database_name] 吗?我正在尝试从另一个数据库中的另一个表中更新一个字段。如果我只是在每次您提到表名时添加数据库名称并查看是否有效,我会看看它是否有效:[new_database_name].[new_table_name]
  • 如果您收到这样的错误,这意味着您必须添加别名。从我的角度来看,上面的例子是可以的。如果您愿意,可以在SET 中的comment 之前添加[new_table_name]。它看起来像[new_table_name] SET [new_table_name].comment。我认为没有必要,因为在更新期间您只能更新一张表。在 T-SQL 中,完全限定名称 (FQN) 为 [db name].[schema owner].[table name].[column name]。试试看,因为我看到你没有在你的最终示例中添加它。如果您不确定哪个是 onwer,您可以像 [db name]..[table name] 一样省略它。
  • 如果您要寻找另一个数据库或架构,那么这里将是完整的语法:UPDATE [DB].[Schema].[new_table_name] SET comment = [DB].[Schema].[old_table_name ].onecomment FROM [DB].[Schema].[new_table_name] INNER JOIN [DB].[Schema].[old_table_name] ON [DB].[Schema].[new_table_name].aboutme_id = [DB].[Schema] .[old_table_name].aboutme_id
猜你喜欢
  • 2011-07-30
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多