gpt4 book ai didi

mysql - 插入表强制新主键

转载 作者:行者123 更新时间:2023-11-29 13:48:31 27 4
gpt4 key购买 nike

在 MySQL 中,我想复制几条记录,但因为有大量列,我不想在插入中列出表中的每个列名称。我尝试使用 ON DUPLICATE KEY 子句执行 INERT INTO,但它不起作用。我首先将记录复制到临时表中。设置如下所示:

CREATE TABLE copy_of_test LIKE test;
INSERT INTO copy_of_test SELECT * FROM test WHERE some_column IN (@X, @Y, @Z);
UPDATE copy_of_test SET some_other_column = @NewValue;
INSERT INTO test SELECT * FROM copy_of_test
ON DUPLICATE KEY UPDATE test.idTest = last_insert_id(test.idTest);

最后的 INSERT 将显示:

查询正常,0 行受影响(0.00 秒)记录:3 重复:0 警告:0

但是测试中没有插入任何记录。我尝试了此查询的各种其他版本,但只收到有关语法或列名歧义的错误消息。我错过了什么?

我真正想要的是这样的:

INSERT INTO test SELECT * FROM copy_of_test
ON DUPLICATE KEY AUTO_INCREMENT test PRIMARY KEY;

最佳答案

这是一个(非常)快速但肮脏的方法,应该有效:

CREATE TABLE copy_of_test LIKE test;
INSERT INTO copy_of_test SELECT * FROM test WHERE some_column IN (@X, @Y, @Z);
UPDATE copy_of_test SET some_other_column = @NewValue;
UPDATE copy_of_test SET idTest = idTest + (SELECT MAX(idTest) FROM test); -- here's where the magic happens
INSERT INTO test SELECT * FROM copy_of_test

编辑 - 这是另一种类似的快速但肮脏的方法,不会使用子查询:(如果存在其他唯一性限制,这将不起作用。)

CREATE TABLE copy_of_test LIKE test;
ALTER TABLE copy_of_test DROP PRIMARY KEY, MODIFY idTest INT;
ALTER TABLE copy_of_test ALTER idTest DROP DEFAULT;
INSERT INTO copy_of_test SELECT * FROM test WHERE some_column IN (@X, @Y, @Z);
UPDATE copy_of_test SET some_other_column = @NewValue, idTest = null;
INSERT INTO test SELECT * FROM copy_of_test

不过,在我看来,您不应该仅仅为了避免写下所有列名称而使用此类技巧。仅仅为也可以使用单个语句进行的查询创建临时表绝对不是一个好的解决方案。您可能想找到一种以编程方式创建语句的方法。 SHOW COLUMNS IN test 可以成为您的 friend 。

关于mysql - 插入表强制新主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17076535/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com