如何将MySQL数据库中的行复制到另一个数据库?

4

我有两个不同数据库(WAMP服务器)中的表,它们具有相同的结构。我想将第一个数据库(newkt)中不存在于第二个数据库(oldkt)中的所有行复制到第二个数据库(oldkt)中。

newkt   -> table : users (1500 records) (id, name, password)
oldkt   -> table : users (1200 records) (id, name, password)

我希望向oldkt数据库添加行,其id在oldkt中尚不存在。
另外,如果我有超过3列,这些列是否可以自动添加,还是需要手动标记?

使用普通的SQL,但是在表名前加上数据库名称和点号,就像这里所示:https://dev59.com/IHI95IYBdhLWcg3w1Bro - rkosegi
2
你到目前为止尝试了什么?如果你展示一下你的SQL语句,那么指导你会更容易些。 - I kiet
到目前为止,我担心我会搞砸表格..!!! - KoZe
2
你实际使用的是哪个数据库管理系统?MySQL还是SQL Server? - user330315
在你做任何事情之前,不管是任何东西,永远都要先备份。 - Strawberry
6个回答

10
您可以按照以下方式操作:

您可以按以下步骤:

    insert into database1.table  select * from database2.table where id not in(select id from database1.table);

0

如前所述,您应该能够通过在查询中指定数据库名称来执行典型的插入操作:

SELECT * 
INTO TargetDatabase.dbo.TargetTable
FROM SourceDatabase.dbo.SourceTable 

非常感谢您的快速回复。 - KoZe
我遇到了一个错误:未声明的变量:oldkt_,这是第一个数据库的名称。 - KoZe

0

尝试下面的代码:

INSERT INTO TargetDatabase.dbo.TargetTable
SELECT * FROM SourceDatabase.dbo.SourceTable 
EXCEPT 
SELECT * FROM TargetDatabase.dbo.TargetTable

我尝试了以下的INSERT INTO oldkt_.dbo.jos_users SELECT * FROM kenaktoolsdata.dbo.jos_users EXCEPT SELECT * FROM oldkt_.dbo.jos_users,但是我收到了错误信息#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.jos_users SELECT * FROM kenaktoolsdata.dbo.jos_users EXCEPT SELECT * FROM oldkt' at line 1。 - KoZe
以上代码是针对 SQL Server 的,如果是针对 MY SQL,请使用下面的带有左外连接的代码:'INSERT TargetDatabase.dbo.TargetTable SELECT a.* FROM SourceDatabase.dbo.SourceTable a LEFT JOIN TargetDatabase.dbo.TargetTable b ON a.col1=b.col1 and ..... WHERE b.col1 IS NULL or b.col2 is null ..... ' - SaravanaC

0
INSERT INTO oldkt   
SELECT id , name ,password FROM newkt WHERE id NOT IN (SELECT id FROM oldkt ) 

点击这里查看


0

尝试这个查询

INSERT Table2
SELECT * FROM Table1
WHERE [Conditions]

0

免责声明:原本OP将问题标记为。我提供了两者的答案,因为这是一个比纯粹的MySQL更通用的解决方案。在使用MySQL时,请确保将查询中的..替换为

SELECT … INTO table在MySQL中不起作用(虽然它在SQL Server中可以工作),所以INSERT … SELECT会帮助你。它在MySQLSQL Server中都可以工作。

您可以使用 . (点)分隔符{{link1:在MySQL中}}和 .. (双点)分隔符指定包括数据库名称的表名。 (另请参见{{link2:相关问题}}。)

{{link3: EXCEPT 在MySQL中不起作用}},因此我们将使用 LEFT JOIN WHERE 。 (另请参见{{link4:相关问题}}。)

对于SQL Server:

INSERT INTO oldkt..users
SELECT newkt..users.*
FROM
    newkt..users
    LEFT JOIN oldkt..users USING(id)
WHERE
    oldkt..users.id IS NULL

在MySQL中使用时,只需将..替换为.

我的解决方案基于假设id是两个表中的唯一键。 (主键始终是唯一的。)如果不满足此条件,则必须调整连接条件以适应该事实。


非常感谢您的回答,但我收到了错误 #1064 - 您的 SQL 语法有误,请检查与您的 MySQL 服务器版本相对应的手册,以获得在第 1 行使用的正确语法。INSERT INTO oldkt_..jos_users SELECT kenaktoolsdata..jos_users.* FROM kenaktoolsdata..jos_users LEFT JOIN oldkt_..jos_users USING(id) WHERE oldkt_..users.id IS NULL - KoZe
@KoZe 你在MySQL中使用了我为MS SQL Server编写的查询语句。正如我所写的,将所有的“..”替换为“.”,它就可以为你工作了。此外,请查看你问题下面的评论,特别是那个要求你指定是否使用MySQL或SQL Server的评论。我为两者都提供了答案。 - Palec
我也遇到了同样的错误...不过这个语句可以解决问题:insert into database1.table select * from database2.table where id not in(select id from database1.table); 可能是因为加上了分号“;”才起作用?这是MySql。 - KoZe
@Koze 如果你将所有的 .. 替换为 .,那么你就不会得到相同的错误,因为原始的错误信息包含了 ..。如果你通过 mysql 命令运行查询,你总是需要在末尾添加 ;,否则它不会被执行。我编辑了你的问题以反映你正在问一个 MySQL 的问题。 - Palec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接