复制表中的所有行并防止重复键

Ton*_*bet 6 mysql sql clone temp-tables

我想这样做

  • 获取名为blog的博客中的所有行.
  • 将它们复制到临时数据库中
  • 编辑此临时表记录的语言字段
  • 插入博客表

而我正在尝试这样:

CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2;
UPDATE tmptable SET lan = 1;
INSERT INTO blogs SELECT * FROM tmptable; dump database tmptable;
Run Code Online (Sandbox Code Playgroud)

但是对于科西嘉,我得到重复的关键错误......

我该如何预防呢?

-编辑-

我试过了:

CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2;
UPDATE tmptable SET lan = 1;
ALTER TABLE tmptable DROP id;
INSERT INTO blogs SELECT * FROM tmptable; dump database tmptable;
Run Code Online (Sandbox Code Playgroud)

但那么 Column count doesn't match value count at row 1

-编辑-

我相信这会起作用(它确实有,因为我知道有多少记录存在)

CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2;
UPDATE tmptable SET lan = 1;
UPDATE tmptable SET id = id + 1000;
INSERT INTO blogs SELECT * FROM tmptable;
Run Code Online (Sandbox Code Playgroud)

但是我怎么能正确地做到这一点?(只需为主键(id)设置下一个可用的自动增量值(不含PHP /类似))

-编辑-

也许是这样的???

CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2;
UPDATE tmptable SET lan = 1;
UPDATE tmptable SET id = id + (SELECT id FROM blogs ORDER BY id DESC LIMIT 1);
INSERT INTO blogs SELECT * FROM tmptable;
Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 14

不需要临时表.

INSERT INTO blogs (lan, col1, col2, col3, ...)
SELECT 1, col1, col2, col3, ...
FROM blogs
WHERE lan = 2
Run Code Online (Sandbox Code Playgroud)

替换col1, col2, col3, ...为除lan和之外的所有列的列表id.

  • 这是你经常要做的吗?您的表架构是否有很大变化?如果是这样,您可以编写一个从information_schema动态生成SQL的存储过程. (2认同)

小智 5

CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2;
UPDATE tmptable SET lan = 1;
alter table tmptable drop column id;
INSERT INTO blogs SELECT NULL,tmptable.* FROM tmptable;
Run Code Online (Sandbox Code Playgroud)

假设“id”列是第一列。