我需要将一个表复制到另一个表,两个表都包含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
答案 0 :(得分:2)
AUTOINCREMENT
只能用于INTEGER PRIMARY KEY的列,它是INTEGER PRIMARY KEY,它是使列成为特殊列的因子,如果在插入行时没有提供该值将分配唯一的整数。
因此,可以使用INTEGER PRIMARY KEY
或INTEGER PRIMARY KEY AUTOINCREMENT
列指定一个整数值,并使用给定值插入可能行。
如果该值不唯一,则不会插入具有给定值的行。
例如,如果表格时间表目前是: -
然后
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');
因此,遵循以上内容的最终结果是: -
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
生成: -