將表 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;
(id, name, add),順序與 SELECT 對應id, name, NULL,第三列用 NULL 填充NULL 需與 add 列類型兼容(通常均可)id 為自增,目標列表可省略 id,源 SELECT 也不取 id
INSERT INTO B (user_id, user_name, address)
SELECT id, name, NULL FROM A;
INSERT INTO B (id, name, add)
SELECT id, name, NULL FROM A WHERE name LIKE '張%';
-- 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;
-- 避免事務日志過大、鎖表時間過長
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 工具