MySQL跨库INSERT INTO SELECT直接支持,语法为INSERT INTO db1.t1() SELECT ... FROM db2.t2;PostgreSQL不支持跨库,需用postgres_fdw或导出导入;SQL Server用三段式名称,跨实例需linked server。

MySQL 跨库 INSERT INTO SELECT 怎么写
MySQL 支持直接跨数据库(schema)执行 INSERT INTO ... SELECT,前提是两个库在同一个实例里,且当前用户有对应库的 SELECT 和 INSERT 权限。
语法就是把表名写成 db_name.table_name 形式:
INSERT INTO target_db.target_table (col1, col2) SELECT src_col1, src_col2 FROM source_db.source_table WHERE ...;
- 不需要
USE切库,也不用建链接或别名 - 如果列名、类型不一致,会按位置顺序严格映射,建议显式写出字段列表,避免隐式转换出错
- 目标表必须已存在;如果想连建表带插入,得用
CREATE TABLE ... AS SELECT,但那是另一条路
PostgreSQL 跨库不能直接 INSERT INTO SELECT
PostgreSQL 的每个数据库是隔离的进程级实例,INSERT INTO ... SELECT 无法跨 database 执行——这不是权限问题,是架构限制。
常见应对方式只有两个:
- 用
postgres_fdw扩展:在目标库中创建 foreign server + foreign table,把源库的表“映射”进来,再对 foreign table 做SELECT;操作前确保已CREATE EXTENSION postgres_fdw,且配置了正确的连接参数 - 导出导入:用
pg_dump --table=... --data-only+psql,或COPY ... TO STDOUT配合管道重定向,适合一次性大批量迁移
注意:dblink 扩展也能查远程库,但它返回的是记录集(record),不能直接塞进 INSERT ... SELECT 的右侧,得套一层 SELECT * FROM dblink(...) AS t(...),字段定义必须完全匹配,否则报 column definition list is required 错误。
SQL Server 跨库 INSERT 需要三段式名称
SQL Server 允许跨库(甚至跨实例)操作,只要登录账户在目标库和源库都有足够权限,且目标实例启用了 Ad Hoc Distributed Queries(用 sp_configure 开)。
标准写法是三段式对象名:[database].[schema].[table]:
INSERT INTO [target_db].[dbo].[target_table] (col1, col2) SELECT col1, col2 FROM [source_db].[dbo].[source_table];
- 方括号不是可选的——一旦库名含短横线(如
my-db)、空格或关键字,就必须加 - 跨实例要用四段式:
[server].[database].[schema].[table],此时依赖linked server配置,且RPC Out必须启用 - 若提示
The object name ... contains more than the maximum number of prefixes,说明某段名写错了,比如多写了dbo或漏了方括号
权限和事务边界容易被忽略
跨库操作不会自动开启分布式事务,各库的提交/回滚是独立的。也就是说,哪怕你在一个事务里写两条跨库 INSERT,一个成功一个失败,也不会自动回滚前者。
- MySQL:事务只对本库生效;跨库 DML 不受同一
BEGIN/COMMIT约束 - PostgreSQL:foreign table 查询走的是远端事务,本地事务无法控制它;
dblink的调用默认是自动提交的,除非显式用dblink_exec加transaction参数 - SQL Server:本地事务能包裹跨库语句,但跨实例(linked server)时,需要
MSDTC支持,且客户端连接字符串得启用Enlist=true
实际写脚本时,别假设“一条事务搞定所有库”,该分步校验就分步校验,该加重试就加重试。


















