我正在运行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 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);
上述语句执行时没有错误,但不向表所有权添加行。
所以我觉得我很接近但不太相似......
最好的方法是什么?我想避免在我手动指定字段/值的情况下进行插入操作。我只需要重新生成一个新的A.I.插入上的recno列。
答案 0 :(得分:1)
插入到自动递增字段中的NULL值最终得到下一个自动递增值,其行为等同于INSERTing而未指定字段;所以你应该能够更新源(临时副本)以使该字段为NULL。
但是,在像您这样的场景中可能出现的一个潜在问题是CREATE TEMPORARY TABLE ... 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]...
它在一个查询中完成任务,使查询更加自我记录,并且只需要一点点输入(大多数是一个体面的数据库浏览器或查询构建器,将为您做)。
真正支持您当前方法的唯一论据是,可以更改所涉及的表,而不必破坏您的查询;但这引出了一个问题:这种表更改是否会更好地打破查询,迫使它们被重新检查。如果不是问题,那是一个小修改;但另一种选择是继续有效的查询,这些查询可能会因复制他们从未打算过的信息而导致意外行为。