是否可以在autoincrement列中插入指定的值?

时间:2018-02-01 10:09:34

标签: sqlite

我需要将一个表复制到另一个表,两个表都包含AUTOINCREMENT列。是否可以将定义的值插入AUTOINCREMENT列。

表格:

CREATE TABLE tmptimetables (
    _id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    _title NVARCHAR(256) NOT NULL,
    _weeks INTEGER NOT NULL,
    _first_week_date INTEGER NOT NULL,
    _auto_complete INTEGER NOT NULL,
    _first_lesson_time INTEGER NOT NULL,
    _lesson_duration INTEGER NOT NULL,
    _break_duration INTEGER NOT NULL,
    _color INTEGER NOT NULL,
    _symbol NCHAR(1) NOT NULL
);

CREATE TABLE timetables (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    title NVARCHAR(256) NOT NULL,
    weeks INTEGER NOT NULL,
    first_week_date INTEGER NOT NULL,
    auto_complete INTEGER NOT NULL,
    first_lesson_time INTEGER NOT NULL,
    lesson_duration INTEGER NOT NULL,
    break_duration INTEGER NOT NULL,
    color INTEGER NOT NULL,
    symbol NCHAR(1) NOT NULL
);

我的SQL请求:

INSERT INTO timetables (
    auto_complete, 
    break_duration, 
    color, 
    first_lesson_time, 
    first_week_date, id, 
    lesson_duration, 
    symbol, 
    title, 
    weeks
) 

SELECT 
    _auto_complete, 
    _break_duration, 
    _color, 
    _first_lesson_time, 
    _first_week_date, 
    _id, 
    _lesson_duration, 
    _symbol, 
    _title, 
    _weeks 
FROM tmptimetables

1 个答案:

答案 0 :(得分:2)

AUTOINCREMENT只能用于INTEGER PRIMARY KEY的列,它是INTEGER PRIMARY KEY,它是使​​列成为特殊列的因子,如果在插入行时没有提供该值将分配唯一的整数。

因此,可以使用INTEGER PRIMARY KEYINTEGER PRIMARY KEY AUTOINCREMENT列指定一个整数值,并使用给定值插入可能行。

如果该值不唯一,则不会插入具有给定值的行。

例如,如果表格时间表目前是: -

enter image description here

然后

INSERT INTO timetables (id,title,weeks,first_week_date,auto_complete,first_lesson_time,lesson_duration,break_duration,color,symbol) VALUES (null,'mytitle',78,86000,23,1800,900,200,16,'E');

将插入一个新行,其id由SQLite算法确定,用于提供唯一ID(可能为5)。

如果id被更改为提供(即非空),请按照以下方式对10进行说明: -

INSERT INTO timetables (id,title,weeks,first_week_date,auto_complete,first_lesson_time,lesson_duration,break_duration,color,symbol) VALUES (10,'mytitle',78,86000,23,1800,900,200,16,'E');

然后新行的id为10.

但是,如果然后使用(相同的SQL,但最后一列值已更改): -

INSERT INTO timetables (id,title,weeks,first_week_date,auto_complete,first_lesson_time,lesson_duration,break_duration,color,symbol) VALUES (10,'mytitle',78,86000,23,1800,900,200,16,'Z');

不会插入新行,因为已存在id为10的行。

最后,如果没有给出id(使用null),但SQL是相同的,插入一个新行,其中唯一的id由SQLite提供,例如

INSERT INTO timetables (id,title,weeks,first_week_date,auto_complete,first_lesson_time,lesson_duration,break_duration,color,symbol) VALUES (null,'mytitle',78,86000,23,1800,900,200,16,'Z');

因此,遵循以上内容的最终结果是: -

enter image description here

AUTOINCREMENT

AUTOINCREMENT关键字仅适用于INTEGER PRIMARY COLUMN,会调用不同的算法来确定下一个序列,以确保下一个序列/ ID始终更大,而没有AUTOINCREMENT a可以应用较低的序列/ id。

AUTOINCREMENT关键字未指定如果未提供列的值,则应用序列/标识,INTEGER PRIMARY KEY指定该值。实际上,默认情况下,即除非指定WITHOUT ROWID,否则所有表都会发生这种情况。它只是隐藏了特殊的 rowid 列。指定<column_name> INTEGER PRIMARY KEY(哪里是有效的列名称)会创建 rowid 的别名。

例如,使用SELECT rowid,* FROM timetables生成: -

enter image description here