Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 重新插入表记录并更新自动增量主索引_Mysql_Sql_Database_Mariadb - Fatal编程技术网

Mysql 重新插入表记录并更新自动增量主索引

Mysql 重新插入表记录并更新自动增量主索引,mysql,sql,database,mariadb,Mysql,Sql,Database,Mariadb,我正在运行5.5.56 我希望复制数据库中的整行,更改一列,然后将整行插入到原始数据库中(我不想指定单个字段,因为有很多字段)。我遇到的问题是如何处理自动递增/主键列 例如: create temporary table t_ownership like ownership; insert into t_ownership (select * from ownership where name='x' LIMIT 1); update t_ownership set id='something

我正在运行5.5.56

我希望复制数据库中的整行,更改一列,然后将整行插入到原始数据库中(我不想指定单个字段,因为有很多字段)。我遇到的问题是如何处理自动递增/主键列

例如:

create temporary table t_ownership like ownership;
insert into t_ownership (select * from ownership where name='x' LIMIT 1);
update t_ownership set id='something else';
insert into ownership (select * from t_ownership); 
我有一个列“recno”,它是一个自动递增的列,当我尝试将稍微更改的记录重新插入到原始表中时,它将在数据库中创建一个冲突

类似的操作似乎有效,但不会导致插入:

insert into ownership (select * from t_ownership) ON DUPLICATE KEY UPDATE recno=LAST_INSERT_ID(ownership.recno);
上述语句执行时不会出错,但不会向表所有权添加行

所以我想我很接近,但不太接近


最好的方法是什么?我希望避免执行手动指定字段/值的插入。我只需要在insert上重新生成一个新的a.I.recno列。

插入到自动递增字段中的NULL值最终只得到下一个自动递增值,其行为等同于插入而不指定字段;因此,您应该能够将源(临时副本)更新为该字段为NULL

然而,像您这样的场景中可能出现的一个潜在问题是
创建临时表。。。LIKE
可能导致一个表,不允许您将这些字段设置为NULL;这将要求您要么修改临时表,要么以更明确的方式创建它。无论哪种方式,它现在都使不指定列的代码/查询更加依赖于已知列

就我个人而言,我首先会选择这条路线

INSERT INTO theTable([list all but the auto-inc column])
SELECT [list all but the auto-inc column, with any replacements or modifications desired]
FROM ...[original query]...
它在一个查询中完成任务,使查询更加自我记录,并且只需花费少量的输入(大多数情况下,一个像样的数据库浏览器或查询生成器都可以为您提供)


真正支持当前方法的唯一理由是,可以更改所涉及的表,而不必中断查询;但这就引出了这样一个问题:这样的表更改是否会更好地打断查询,迫使它们重新检查。如果它不是一个问题,它是一个小的修订;但另一种选择是继续有效的查询,由于复制从未打算复制的信息,可能会导致意外行为。

最干净的方法是指定所有字段,但您不能在t_所有权中将recno设置为NULL吗?我考虑过这一点。。我会试试看它是否有效。是的!成功了!这将解决我的问题,虽然我很好奇是否有任何其他的工作,我不知道。添加作为一个答案,以防没有其他人提出。谢谢!这可能是最好的方法,但我也很好奇是否还有其他解决办法。奇怪的是,似乎没有一种方法可以在不进行单独的数据库调用的情况下获取下一个逻辑a.I.值。实际上,这对我很有效-我不确定是否可以将自动增量索引设置为null,但它确实有效。操作问题是,我不想指定每个字段,因为有很多字段,我只需要更改1-2列。在将临时表的recno字段更新为该字段后,它是否为空?我担心的是更新集NULL实际上会将其设置为临时表的下一个自动增量值;这恰好与原始表的相同…如果没有问题,除非在“从中选择”和“重新插入”之间将记录插入到该表中。(但我从未尝试过将auto inc更新为NULL,所以我不知道它的实际行为)。。。然后,当我复制到原始表时,它为该列创建了一个A.I.值,这就是我想要的:)我可能能够逃脱它,因为数据库中只有一条记录?也许内部是0?