代码之家  ›  专栏  ›  技术社区  ›  David B

SQL Lite Studio生成的DDL不正确

  •  1
  • David B  · 技术社区  · 7 年前

    我正在使用sql lite studio创建一个sqllite数据库,但是它生成的DDL给出了一个错误,我希望我的主键是自动编号,这里是我选择的代码和选项

    PRAGMA foreign_keys = 0;
    
    CREATE TABLE sqlitestudio_temp_table AS SELECT *
                                              FROM ExportProcessed;
    
    DROP TABLE ExportProcessed;
    
    CREATE TABLE ExportProcessed (ID INTEGER PRIMARY KEY, ORDERID INTEGER, PROCESSED BOOLEAN, ProcessedBy STRING, PRIMARY KEY (ID DESC) AUTOINCREMENT);
    INSERT INTO ExportProcessed (
                                    ID,
                                    ORDERID,
                                    PROCESSED,
                                    ProcessedBy
                                )
                                SELECT ID,
                                       ORDERID,
                                       PROCESSED,
                                       ProcessedBy
                                  FROM sqlitestudio_temp_table;
    
    DROP TABLE sqlitestudio_temp_table;
    
    PRAGMA foreign_keys = 1;
    

    enter image description here

    这是自动增量

    enter image description here

    这是我收到的错误信息 enter image description here 这是我使用的SQL Lite Studio的版本。

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  1
  •   MikeT    7 年前

    您正在尝试创建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 with the highest possible rowid
    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 with the highest possible rowid
    INSERT INTO ExportProcessed (ORDERID,PROCESSED, PROCESSEDBY) VALUES (100,0,null);
    SELECT * FROM ExportProcessed;
    

    前者(v2) 没有 自动增量 工程和结果:

    enter image description here

    也就是说,在达到尽可能高的rowid之后,使用了较低的可用/未使用的rowid。

    但是,后者使用 自动增量 不符合:

    INSERT INTO ExportProcessed (ORDERID,PROCESSED, PROCESSEDBY) VALUES (100,0,null)
    > database or disk is full
    

    如果在事务中插入或不插入将导致一个表:

    enter image description here


    其他Re-sqlite工作室

    在安装了sqlite studio并检查了一些场景之后,发现了以下问题。

    1。当只有1个主键时,可以为每个表定义多个主键,例如 -

    enter image description here

    正在生成的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)
    );