SQLite表的主键是否可以具有自定义默认值?
我找不到任何说明主键字段不能有默认值的文档。然而,我对这个测试代码的实验并没有成功。它被接受为有效,但只生成(n+1)的值。它适用于非主键字段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
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插入测试行时,这两种默认值解决方案都开始工作。