首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 異表結構數據複製:INSERT INTO SELECT 指定列實現字段映射

     編輯:程式設計綜合問答

將表 A(id, name)數據複製到表 B(id, name, add),B 表多出 add 字段需默認為 NULL。標準 SQL 使用 INSERT INTO ... SELECT 顯式指定列實現。

標準語句


INSERT INTO B (id, name, add) 
SELECT id, name, NULL FROM A;

關鍵點

  1. 目標表顯式列出列名:(id, name, add),順序與 SELECT 對應
  2. 源表 SELECT 列表對應:id, name, NULL,第三列用 NULL 填充
  3. 類型兼容:NULL 需與 add 列類型兼容(通常均可)
  4. 自增主鍵處理:若 id 為自增,目標列表可省略 id,源 SELECT 也不取 id

進階場景

1. 字段名不同映射


INSERT INTO B (user_id, user_name, address) 
SELECT id, name, NULL FROM A;

2. 條件複製


INSERT INTO B (id, name, add) 
SELECT id, name, NULL FROM A WHERE name LIKE '張%';

3. 避免重複插入(基於主鍵)


-- MySQL
INSERT INTO B (id, name, add) 
SELECT id, name, NULL FROM A 
ON DUPLICATE KEY UPDATE name=VALUES(name);

-- SQL Server
MERGE INTO B USING A ON B.id = A.id
WHEN NOT MATCHED THEN INSERT (id, name, add) VALUES (A.id, A.name, NULL);

-- PostgreSQL
INSERT INTO B (id, name, add) 
SELECT id, name, NULL FROM A 
ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name;

4. 複製大表分批提交


-- 避免事務日志過大、鎖表時間過長
WHILE EXISTS (SELECT 1 FROM A WHERE id > @lastId)
BEGIN
    INSERT INTO B (id, name, add) 
    SELECT TOP 10000 id, name, NULL FROM A WHERE id > @lastId ORDER BY id;
    SET @lastId = (SELECT MAX(id) FROM B);
END

注意事項

  • 確保目標表無 NOT NULL 約束無默認值的列未在插入列表中
  • 大數據量時考慮 BULK INSERT、bcp、LOAD DATA 等工具
  • 跨庫/跨服務器需用 OPENROWSET、Linked Server 或 ETL 工具
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved