您正在尝试创建2个主索引。然而,
AUTOINCREMENT
突出显示为错误
(AS)
自动增量
只能为已在内部/理论上创建的主索引指定,因此现在无法对其进行编码)
.
正在删除
自动增量
结果
表“exportprocessed”有多个主键
.
修复方法可能是:
CREATE TABLE ExportProcessed (ID INTEGER, ORDERID INTEGER, PROCESSED BOOLEAN, ProcessedBy STRING, PRIMARY KEY(ID DESC AUTOINCREMENT));
附加考虑
你真的需要还是想要
自动增量
?所有这些
自动增量
是否指定在确定基础时使用不同的算法
罗维德
以及
罗维德
大于使用的最大值
罗维德
.
不编码
自动增量
,但仍在定义
INTEGER PRIMARY KEY
仍会导致自动生成
罗维德
(在使用最大行ID 9223372036854775807之前/如果使用最大行ID 9223372036854775807,则通常会更大,之后使用
自动增量
将失败,出现sqlite_full错误,但如果可用,将尝试使用自由/未使用的较低值)
.
使用
ID INTEGER PRIMARY KEY
或
ID INTEGER,..., PRIMARY KEY(ID)
有或没有
自动增量
使列ID成为
罗维德
(通常看不到列)。
使用
自动增量
有日常开支,不建议按照以下要求:
autoincrement关键字增加了额外的CPU、内存、磁盘空间,以及
磁盘I/O开销,如果不严格需要,应该避免。它是
通常不需要。
SQLite Autoincrement
自动增量
v不编码示例
考虑以下事项:
DROP TABLE IF EXISTS ExportProcessedV2;
CREATE TABLE IF NOT EXISTS ExportProcessedV2 (ID INTEGER, ORDERID INTEGER, PROCESSED BOOLEAN, ProcessedBy STRING, PRIMARY KEY(ID DESC));
INSERT INTO ExportProcessedV2 (ORDERID,PROCESSED, PROCESSEDBY) VALUES (100,0,null);
INSERT INTO ExportProcessedV2 (ORDERID,PROCESSED, PROCESSEDBY) VALUES (100,0,null);
INSERT INTO ExportProcessedV2 VALUES(9223372036854775807,100,0,null);
INSERT INTO ExportProcessedV2 (ORDERID,PROCESSED, PROCESSEDBY) VALUES (100,0,null);
SELECT * FROM ExportProcessedV2;
DROP TABLE IF EXISTS ExportProcessed;
CREATE TABLE IF NOT EXISTS ExportProcessed (ID INTEGER, ORDERID INTEGER, PROCESSED BOOLEAN, ProcessedBy STRING, PRIMARY KEY(ID DESC AUTOINCREMENT));
INSERT INTO ExportProcessed (ORDERID,PROCESSED, PROCESSEDBY) VALUES (100,0,null);
INSERT INTO ExportProcessed (ORDERID,PROCESSED, PROCESSEDBY) VALUES (100,0,null);
INSERT INTO ExportProcessed VALUES(9223372036854775807,100,0,null);
INSERT INTO ExportProcessed (ORDERID,PROCESSED, PROCESSEDBY) VALUES (100,0,null);
SELECT * FROM ExportProcessed;
前者(v2)
没有
自动增量
工程和结果:
也就是说,在达到尽可能高的rowid之后,使用了较低的可用/未使用的rowid。
但是,后者使用
自动增量
不符合:
INSERT INTO ExportProcessed (ORDERID,PROCESSED, PROCESSEDBY) VALUES (100,0,null)
> database or disk is full
如果在事务中插入或不插入将导致一个表:
其他Re-sqlite工作室
在安装了sqlite studio并检查了一些场景之后,发现了以下问题。
1。当只有1个主键时,可以为每个表定义多个主键,例如
-
正在生成的DDL(无法提交):。-
CREATE TABLE EPV1 (ID INTEGER PRIMARY KEY DESC AUTOINCREMENT, PRIMARY KEY (ID DESC) AUTOINCREMENT, PRIMARY KEY (ID ASC), PRIMARY KEY (ID DESC) AUTOINCREMENT);
** 2。未正确处理具有整数主键desc的sqlite错误。
sqlite有一个bug
如果声明类型为“integer”的列的声明包括
“primary key desc”子句,它不会成为
rowid和未分类为整数主键。这个怪癖是
不是设计的。这是由于早期版本的sqlite中的错误造成的。但是
修复错误可能导致向后不兼容。因此,
原始行为已被保留(并记录在案),因为
角落案例中的行为远远优于兼容性中断。
这意味着以下三个表声明都会导致
列“x”是rowid(整数主键)的别名:
如果配置为
自动增量
排序
DESC
创建DDL为
CREATE TABLE EPV1 (
ID INTEGER PRIMARY KEY DESC AUTOINCREMENT
);
上述ID的应付款不是
罗维德
因此不能
自动增量
已编码。正确的DDL应该略有不同:
CREATE TABLE IF NOT EXISTS EPV1 (
ID INTEGER, PRIMARY KEY (ID DESC AUTOINCREMENT)
);