使用 SQL 将数据批量插入到空(但存在)记录中
Bulk insert data into empty (but existing) records with SQL
第一个 table 列(A 到 G)已经填充了每个 row/record 的数据,但是 H 到 K 列还没有数据。所以我必须为这些列添加数据,为 table 中的每一行添加数据(1 到 285,无论数字是多少)。 A 到 G 列应保持不变!
我使用什么 SQL 查询将数据插入 现有 但 空 记录?不覆盖除 H 到 K 以外的任何列?
我正在寻找可以做到这一点的东西:
INSERT INTO `table` (`record_id`, `colA`, `colB`, `colC`, `colD`, `colE`, `colF`, `colG`, `colH`, `colI`, `colJ`, `colK`)
VALUES
(`auto-increment 1`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
(`auto-increment 2`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
(`auto-increment 3`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
一直到第 285 行:
(`auto-increment 285`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
您可以将查询编写为一组更新语句,例如:
UPDATE t SET h = .., i = .. WHERE id = 1
UPDATE t SET h = .., i = .. WHERE id = 2
如果所有列都获得相同的值,或者它们的块获得相同的值,您可以调整 WHERE 子句或省略它
如果您希望 MySQL 帮助生成更新语句块,请记住它们最终只是字符串,因此您总是可以这样做:
SELECT CONCAT('update t set h = .., i = .. where id = ', id) FROM t
它会在 table 中的每一行为你生成一个更新语句,并将 ID 连接到每一行上。你可以将它们从结果网格中复制出来,粘贴到查询编辑器中,调整它们和 运行。当我想对模式进行大量更新语句时,我经常使用这种技术,然后自定义一些
--
您也可以从另一个 table 更新。请参阅此 SO 答案:mysql update column with value from another table
您可以轻松地将查询更改为 INSERT INTO .. ON DUPLICATE KEY UPDATE ... 像这样:
INSERT INTO `table` (`record_id`, `colA`, `colB`, `colC`, `colD`, `colE`, `colF`, `colG`, `colH`, `colI`, `colJ`, `colK`)
VALUES
(`auto-increment 1`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
(`auto-increment 2`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
(`auto-increment 3`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`)
ON DUPLICATE KEY UPDATE
colH=VALUES(colH),
colI=VALUES(colI),
colJ=VALUES(colJ),
colK=VALUES(colK);
注意:如果主键不相同,那么您必须在 cols colH 到 colK 上创建一个复合唯一键。
此查询将插入不存在的行或更新存在键(如主键或其他唯一键)的行。
第一个 table 列(A 到 G)已经填充了每个 row/record 的数据,但是 H 到 K 列还没有数据。所以我必须为这些列添加数据,为 table 中的每一行添加数据(1 到 285,无论数字是多少)。 A 到 G 列应保持不变!
我使用什么 SQL 查询将数据插入 现有 但 空 记录?不覆盖除 H 到 K 以外的任何列?
我正在寻找可以做到这一点的东西:
INSERT INTO `table` (`record_id`, `colA`, `colB`, `colC`, `colD`, `colE`, `colF`, `colG`, `colH`, `colI`, `colJ`, `colK`)
VALUES
(`auto-increment 1`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
(`auto-increment 2`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
(`auto-increment 3`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
一直到第 285 行:
(`auto-increment 285`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
您可以将查询编写为一组更新语句,例如:
UPDATE t SET h = .., i = .. WHERE id = 1
UPDATE t SET h = .., i = .. WHERE id = 2
如果所有列都获得相同的值,或者它们的块获得相同的值,您可以调整 WHERE 子句或省略它
如果您希望 MySQL 帮助生成更新语句块,请记住它们最终只是字符串,因此您总是可以这样做:
SELECT CONCAT('update t set h = .., i = .. where id = ', id) FROM t
它会在 table 中的每一行为你生成一个更新语句,并将 ID 连接到每一行上。你可以将它们从结果网格中复制出来,粘贴到查询编辑器中,调整它们和 运行。当我想对模式进行大量更新语句时,我经常使用这种技术,然后自定义一些
--
您也可以从另一个 table 更新。请参阅此 SO 答案:mysql update column with value from another table
您可以轻松地将查询更改为 INSERT INTO .. ON DUPLICATE KEY UPDATE ... 像这样:
INSERT INTO `table` (`record_id`, `colA`, `colB`, `colC`, `colD`, `colE`, `colF`, `colG`, `colH`, `colI`, `colJ`, `colK`)
VALUES
(`auto-increment 1`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
(`auto-increment 2`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`),
(`auto-increment 3`, `dont-change A`, `dont-change B`, `dont-change C`, `dont-change D`, `dont-change E`, `dont-change F`, `dont-change G`, `new-value H`, `new-value I`, `new-value J`, `new-value K`)
ON DUPLICATE KEY UPDATE
colH=VALUES(colH),
colI=VALUES(colI),
colJ=VALUES(colJ),
colK=VALUES(colK);
注意:如果主键不相同,那么您必须在 cols colH 到 colK 上创建一个复合唯一键。
此查询将插入不存在的行或更新存在键(如主键或其他唯一键)的行。