Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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

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表的主键是否可以具有自定义默认值?_Sql_Sqlite - Fatal编程技术网

SQLite表的主键是否可以具有自定义默认值?

SQLite表的主键是否可以具有自定义默认值?,sql,sqlite,Sql,Sqlite,我找不到任何说明主键字段不能有默认值的文档。然而,我对这个测试代码的实验并没有成功。它被接受为有效,但只生成(n+1)的值。它适用于非主键字段 CREATE Table A ( id INTEGER PRIMARY KEY default(random()) ) 这可能吗?您可以使用autoincrement: CREATE Table A ( id INTEGER PRIMARY KEY AUTOINCREMENT ); create table A (id int prima

我找不到任何说明主键字段不能有默认值的文档。然而,我对这个测试代码的实验并没有成功。它被接受为有效,但只生成(n+1)的值。它适用于非主键字段

CREATE Table A (
  id INTEGER PRIMARY KEY default(random())
)

这可能吗?

您可以使用
autoincrement

CREATE Table A (
    id INTEGER PRIMARY KEY AUTOINCREMENT
);
create table A (id int primary key default(random()));

严格地说,这是不必要的,因为SQLite有一个内置的
rowid

,您可以使用
自动增量

CREATE Table A (
    id INTEGER PRIMARY KEY AUTOINCREMENT
);
create table A (id int primary key default(random()));

严格来说,这是不必要的,因为SQLite有一个内置的
rowid

整型主键
是SQLite中的一种关键字,它是
rowid
的别名,如果您提供了一个,SQLite将自动忽略默认值

因此,您有两种解决方案:

  • 创建不带
    rowid的表

    create table A (id integer primary key default(random())) without rowid;
    
  • id
    声明为整数主键,而不使用“关键字”
    integer主键
    ,例如用
    int
    替换
    integer

    CREATE Table A (
        id INTEGER PRIMARY KEY AUTOINCREMENT
    );
    
    create table A (id int primary key default(random()));
    

  • 关于是否要选择不带rowid的
    路线,您可以阅读文档。

    integer主键
    是SQlite中的一种关键字,是
    rowid
    的别名,如果您提供了它,SQlite将自动忽略默认值

    因此,您有两种解决方案:

  • 创建不带
    rowid的表

    create table A (id integer primary key default(random())) without rowid;
    
  • id
    声明为整数主键,而不使用“关键字”
    integer主键
    ,例如用
    int
    替换
    integer

    CREATE Table A (
        id INTEGER PRIMARY KEY AUTOINCREMENT
    );
    
    create table A (id int primary key default(random()));
    

  • 关于您是否希望在没有rowid的情况下使用
    路线,您可以阅读文档。

    虽然是真的,但这不是我要回答的问题。我对这个问题进行了编辑,使之更加具体。虽然这是事实,但这不是我提出这个问题的目的。我对问题进行了编辑,使其更加具体。主键对于每一行都必须是唯一的。所以默认值是没有意义的。此外,生成随机数(更不用说“主键”)也不能保证是唯一的。事实上,可能会有重复的值。这纯粹是一个简单的例子来说明这个问题。这不是为了实用。嗯,好吧,让我随便说说。。作为技术定义,主键在表中是唯一的。一个键可能由多个列组成-只要“复合键”是唯一的-某些行的键列可能有重复的值,但只要完整的复合键是唯一的,就可以了。最后,还要认识到表中不需要主键。主键对于每一行都是唯一的。所以默认值是没有意义的。此外,生成随机数(更不用说“主键”)也不能保证是唯一的。事实上,可能会有重复的值。这纯粹是一个简单的例子来说明这个问题。这不是为了实用。嗯,好吧,让我随便说说。。作为技术定义,主键在表中是唯一的。一个键可能由多个列组成-只要“复合键”是唯一的-某些行的键列可能有重复的值,但只要完整的复合键是唯一的,就可以了。最后,还要认识到表中不需要主键。我认为您的第一个解决方案在查看文档时是有希望的。但是,尝试时,两种解决方案仍会在字段中返回(n+1)。你有没有得到一个不同的结果?是的,两个都是我做的。你有哪个版本的SQlite?嗯。好的,现在我有你的两个解决方案。问题是我使用的SQLite接口“DB Browser for SQLite”-或者至少是我使用它来测试这个场景的方式。我正在创建表,然后使用GUI的“新建记录”按钮向表中添加行。出于某种原因,它总是添加行(n+1)。当我切换到通过键入SQL inserts插入测试行时,这两个默认值解决方案都开始工作了。我认为您的第一个解决方案在查看文档时是有希望的。但是,尝试时,两种解决方案仍会在字段中返回(n+1)。你有没有得到一个不同的结果?是的,两个都是我做的。你有哪个版本的SQlite?嗯。好的,现在我有你的两个解决方案。问题是我使用的SQLite接口“DB Browser for SQLite”-或者至少是我使用它来测试这个场景的方式。我正在创建表,然后使用GUI的“新建记录”按钮向表中添加行。出于某种原因,它总是添加行(n+1)。当我切换到通过键入SQL inserts插入测试行时,这两种默认值解决方案都开始工作。