You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否向AUTOINCREMENT列插入指定值?跨自增表数据迁移咨询

关于SQLite AUTOINCREMENT列的两个问题解答

嘿,看你的表结构应该是用的SQLite,我来帮你理清这两个问题:

1. 能否向AUTOINCREMENT列插入指定值?

当然可以,但有几个关键细节要注意:

  • 首先,你插入的值必须是该列中从未出现过的唯一值(毕竟它是主键,主键约束要求唯一性)。
  • 插入指定值后,后续自动生成的ID会根据当前列的最大值来递推:
    • 如果你插入的ID比当前列的最大值大,那么下一个自动生成的ID就是这个最大值+1;
    • 如果插入的ID比当前最大值小,后续自动生成的ID依然会按原来的序列继续(比如当前最大ID是5,你插入3,下一个自动生成的还是6)。
  • 举个实际操作的例子,针对你的tmptimetables表:
INSERT INTO tmptimetables (_id, _title, _weeks, _first_week_date, _auto_complete, _first_lesson_time, _lesson_duration, _break_duration, _color, _symbol)
VALUES (100, '周一数学课', 16, 1719849600, 1, 36000, 1800, 600, 0xFF00FF, 'M');

只要_id=100还没在表中出现过,这条语句就能执行成功。

2. 复制数据到另一张含AUTOINCREMENT列的表,能否插入自定义值?

完全没问题,有两种常用的实现方式:

方式一:保留源表的ID值,显式插入

直接指定目标表的所有列(包括AUTOINCREMENT的id列),把源表的对应值复制过去:

INSERT INTO timetables (id, title, weeks, first_week_date, auto_complete, first_lesson_time, lesson_duration, break_duration, color, symbol)
SELECT _id, _title, _weeks, _first_week_date, _auto_complete, _first_lesson_time, _lesson_duration, _break_duration, _color, _symbol
FROM tmptimetables;

⚠️ 注意:如果目标表timetables中已经存在和源表_id重复的id值,这条语句会报错(主键冲突),执行前要确保ID不重复,或者先清理目标表的重复数据。

方式二:不保留源表ID,让数据库自动生成

如果不需要保留源表的ID,只需要省略目标表的id列,数据库会自动按序列生成新的ID:

INSERT INTO timetables (title, weeks, first_week_date, auto_complete, first_lesson_time, lesson_duration, break_duration, color, symbol)
SELECT _title, _weeks, _first_week_date, _auto_complete, _first_lesson_time, _lesson_duration, _break_duration, _color, _symbol
FROM tmptimetables;

额外补充:SQLite中的AUTOINCREMENT关键字主要作用是强制ID严格递增(不会复用已删除的ID),但不管有没有这个关键字,手动插入指定的唯一主键值都是被允许的,核心要求就是保证主键的唯一性。

内容的提问来源于stack exchange,提问作者Denis Steinman

火山引擎 最新活动