Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite Qt自动增量列始终为空_Qt_Sqlite - Fatal编程技术网

SQLite Qt自动增量列始终为空

SQLite Qt自动增量列始终为空,qt,sqlite,Qt,Sqlite,我的应用程序检查数据库文件是否存在,如果不存在,则创建一个数据库文件 其中一个表是这样创建的: CREATE TABLE tAlumnos ( Nombre VARCHAR (100), Apellido VARCHAR (100), DNI INT UNIQUE, Nacimiento DATE,

我的应用程序检查数据库文件是否存在,如果不存在,则创建一个数据库文件

其中一个表是这样创建的:

CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                        Apellido   VARCHAR (100),
                        DNI        INT UNIQUE,
                        Nacimiento DATE,
                        Telefono   INT,
                        ICE        INT,
                        keyid      INTEGER AUTO_INCREMENT,
                        PRIMARY KEY (keyid) );
INSERT INTO tAlumnos (Nombre,Apellido,DNI,Nacimiento,Telefono) VALUES ('Pepe','pepe','20369458','2010-05-02','154222326');
     db = QSqlDatabase::addDatabase("QSQLITE");
     db.setDatabaseName(DBFILE);
但是,当我添加带有如下查询的多行时:

CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                        Apellido   VARCHAR (100),
                        DNI        INT UNIQUE,
                        Nacimiento DATE,
                        Telefono   INT,
                        ICE        INT,
                        keyid      INTEGER AUTO_INCREMENT,
                        PRIMARY KEY (keyid) );
INSERT INTO tAlumnos (Nombre,Apellido,DNI,Nacimiento,Telefono) VALUES ('Pepe','pepe','20369458','2010-05-02','154222326');
     db = QSqlDatabase::addDatabase("QSQLITE");
     db.setDatabaseName(DBFILE);
所有keyid列都为空。我不明白。我做错了什么。 如果我使用AUTOINCREMENT而不是AUTO_INCREMENT,我也会得到一个语法错误,以防万一

当我打开数据库时,我是这样做的:

CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                        Apellido   VARCHAR (100),
                        DNI        INT UNIQUE,
                        Nacimiento DATE,
                        Telefono   INT,
                        ICE        INT,
                        keyid      INTEGER AUTO_INCREMENT,
                        PRIMARY KEY (keyid) );
INSERT INTO tAlumnos (Nombre,Apellido,DNI,Nacimiento,Telefono) VALUES ('Pepe','pepe','20369458','2010-05-02','154222326');
     db = QSqlDatabase::addDatabase("QSQLITE");
     db.setDatabaseName(DBFILE);

有什么想法吗?

您使用了错误的关键字,该关键字是自动增量。然而,这并不是唯一的问题。
AUTOINCREMENT
关键字只能在一种情况下使用,即用于将作为rowid别名的列。对于要作为行ID的别名的列

  • 不能使用不带ROWID的
    定义该表(不带ROWID的
    使用不太常见),并且
  • 列必须声明为
    ??整型主键
    (或作为
    整型,…和其他列定义…),主键(??
    (其中
    表示列名)。
  • AUTOINCREMENT
    然后可以用作
    整型主键AUTOINCREMENT
    整型,…和其他后续列定义(如有)主键(?AUTOINCREMENT)

    将列定义为
    keyid INTEGER AUTO_INCREMENT
    将导致列类型为
    INTEGER AUTO_INCREMENT
    (这将导致类型关联为INTEGER),因此当没有提供值时,期望提供自动生成的值,默认值为null

    因此,您的代码可以是:-

    CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                            Apellido   VARCHAR (100),
                            DNI        INT UNIQUE,
                            Nacimiento DATE,
                            Telefono   INT,
                            ICE        INT,
                            keyid      INTEGER,
                            PRIMARY KEY (keyid AUTOINCREMENT) );
    
    或:-

    然而
    AUTOINCREMENT
    关键字很可能不需要,您可能不需要相关的间接费用(请参阅下面的链接)

    AUTOINCREMENT关键字会增加CPU、内存、磁盘空间和内存 磁盘I/O开销,如果不是严格需要的话,应该避免 通常不需要

    如果插入时未提供值或空值作为值,则主键(??
    仍将自动生成unqiue id(即,该列将是rowid的别名),而不使用关键字,而是使用

    AUTOINCREMENT
    仅确保rowid始终增加(注意,不能保证rowid 将单调增加)

    不使用
    AUTOINCREMENT
    允许使用小于现有最高rowid的未使用/空闲数字,如果使用可能的最高数字(
    AUTOINCREMENT
    将失败,并出现SQLITE_完全异常)。请注意rowid以及别名可能高达9223372036854775807

    • (有关全面的解释,请参见上面的链接)
    因此,您可能希望使用:-

    CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                            Apellido   VARCHAR (100),
                            DNI        INT UNIQUE,
                            Nacimiento DATE,
                            Telefono   INT,
                            ICE        INT,
                            keyid      INTEGER,
                            PRIMARY KEY (keyid) );
    
    或:-


    您使用了错误的关键字,该关键字是自动增量。但是,这不是唯一的问题。只有在一种情况下才能使用
    自动增量
    关键字,即用于将作为rowid别名的列。对于将作为rowid别名的列

  • 不能使用不带ROWID的
    定义该表(不带ROWID的
    使用不太常见),并且
  • 该列必须声明为
  • AUTOINCREMENT
    然后可以用作
    整型主键AUTOINCREMENT
    整型,…和其他后续列定义(如有)主键(?AUTOINCREMENT)

    将列定义为
    keyid INTEGER AUTO_INCREMENT
    将导致列类型为
    INTEGER AUTO_INCREMENT
    (这将导致类型关联为INTEGER),因此当没有提供值时,期望提供自动生成的值,默认值为null

    因此,您的代码可以是:-

    CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                            Apellido   VARCHAR (100),
                            DNI        INT UNIQUE,
                            Nacimiento DATE,
                            Telefono   INT,
                            ICE        INT,
                            keyid      INTEGER,
                            PRIMARY KEY (keyid AUTOINCREMENT) );
    
    或:-

    然而
    AUTOINCREMENT
    关键字很可能不需要,您可能不需要相关的间接费用(请参阅下面的链接)

    AUTOINCREMENT关键字会增加CPU、内存、磁盘空间和内存 磁盘I/O开销,如果不是严格需要的话,应该避免 通常不需要

    如果插入时未提供值或空值作为值,则主键(??
    仍将自动生成unqiue id(即,该列将是rowid的别名),而不使用关键字,而是使用

    AUTOINCREMENT
    仅确保rowid始终增加(注意,不能保证rowid 将单调增加)

    不使用
    AUTOINCREMENT
    允许使用小于现有最高rowid的未使用/空闲数字,如果使用可能的最高数字(
    AUTOINCREMENT
    将失败,并出现SQLITE_完全异常)。请注意rowid以及别名可能高达9223372036854775807

    • (有关全面的解释,请参见上面的链接)
    因此,您可能希望使用:-

    CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                            Apellido   VARCHAR (100),
                            DNI        INT UNIQUE,
                            Nacimiento DATE,
                            Telefono   INT,
                            ICE        INT,
                            keyid      INTEGER,
                            PRIMARY KEY (keyid) );
    
    或:-


    感谢您提供了完整且信息丰富的答案。我从一个在MySQL DB中创建表的旧sql脚本中复制了我的代码。在SQLite中似乎有些事情发生了变化。感谢您提供了完整且信息丰富的答案。我从我的一个sql脚本中复制了我的代码