您可以将插入与ON DUPLICATE KEY UPDATE 一起使用,这将更新现有行。然而,这是基于唯一键约束的。这意味着您必须创建约束或更新现有约束。
它确实要求 5 列中存在唯一数据。
因此,当插入 table_2 中的行并且违反唯一约束时,它将更新行而不是完成插入。
ALTER TABLE table_1
ADD UNIQUE INDEX ix_unique (col_1, col_2, col_3, col_4, col_5);
INSERT INTO table_1(col_1, col_2, col_3, col_4, col_5,
col_6, col_7, col_8, col_9, col_10)
SELECT t.col_1, t.col_2, t.col_3, t.col_4, t.col_5,
t.col_6, t.col_7, t.col_8, t.col_9, t.col_10
FROM table_2 t
ON DUPLICATE KEY UPDATE col_6 = t.col_6, col_7 = t.col_7, col_8 = t.col_8, col_9 = t.col_9, col_10 = t.col_10;
INSERT INTO ... SELECT FROM ... ON DUPLICATE KEY UPDATE
编辑
我能够在 mysql 5.7 上重现此功能,并且自 5.5 以来我已经看到了此功能。
这是我运行的脚本。
CREATE TABLE IF NOT EXISTS `table_1` (
`col_1` int(10) unsigned NULL,
`col_2` int(10) unsigned NULL,
`col_3` int(10) unsigned NULL,
`col_4` int(10) unsigned NULL,
`col_5` int(10) unsigned NULL,
`col_6` int(10) unsigned NULL,
`col_7` int(10) unsigned NULL,
`col_8` int(10) unsigned NULL,
`col_9` int(10) unsigned NULL,
`col_10` int(10) unsigned NULL,
UNIQUE INDEX ix_unique (col_1, col_2, col_3, col_4, col_5)
);
CREATE TABLE IF NOT EXISTS `table_2` (
`col_1` int(10) unsigned NULL,
`col_2` int(10) unsigned NULL,
`col_3` int(10) unsigned NULL,
`col_4` int(10) unsigned NULL,
`col_5` int(10) unsigned NULL,
`col_6` int(10) unsigned NULL,
`col_7` int(10) unsigned NULL,
`col_8` int(10) unsigned NULL,
`col_9` int(10) unsigned NULL,
`col_10` int(10) unsigned NULL
);
INSERT INTO table_1 (`col_1`, `col_2`, `col_3`, `col_4`, `col_5`)
VALUES
(1, 1, 1, 1, 1),
(2, 2, 2, 2, 2),
(3, 3, 3, 3, 3),
(4, 4, 4, 4, 4),
(5, 5, 5, 5, 5),
(6, 6, 6, 6, 6),
(7, 7, 7, 7, 7),
(8, 8, 8, 8, 8),
(9, 9, 9, 9, 9),
(10, 10, 10, 10, 10);
INSERT INTO table_2 (`col_1`, `col_2`, `col_3`, `col_4`, `col_5`, `col_6`, `col_7`, `col_8`, `col_9`, `col_10`)
VALUES
(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
(2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
(3, 3, 3, 3, 3, 3, 3, 3, 3, 3),
(4, 4, 4, 4, 4, 4, 4, 4, 4, 4),
(5, 5, 5, 5, 5, 5, 5, 5, 5, 5),
(6, 6, 6, 6, 6, 6, 6, 6, 6, 6),
(7, 7, 7, 7, 7, 7, 7, 7, 7, 7),
(8, 8, 8, 8, 8, 8, 8, 8, 8, 8),
(9, 9, 9, 9, 9, 9, 9, 9, 9, 9),
(10, 10, 10, 10, 10, 10, 10, 10, 10, 10);
INSERT INTO table_1(col_1, col_2, col_3, col_4, col_5,
col_6, col_7, col_8, col_9, col_10)
SELECT t.col_1, t.col_2, t.col_3, t.col_4, t.col_5,
t.col_6, t.col_7, t.col_8, t.col_9, t.col_10
FROM table_2 t
ON DUPLICATE KEY UPDATE col_6 = t.col_6, col_7 = t.col_7, col_8 = t.col_8, col_9 = t.col_9, col_10 = t.col_10;