防止自动递增整数主键?

Posted

技术标签:

【中文标题】防止自动递增整数主键?【英文标题】:prevent autoincrementing integer primary key? 【发布时间】:2013-06-07 20:06:00 【问题描述】:

我有一个 sqlite 表(sqlite 版本 3.7.3),其中插入到主键列的空值会自动递增:

sqlite> CREATE TABLE foo(bar INTEGER NOT NULL PRIMARY KEY);
sqlite> INSERT INTO foo(bar) VALUES(NULL);
sqlite> SELECT * FROM foo;
1

在sqlite docs 中,它表明将AUTOINCREMENT 关键字添加到列应该会创建此行为,但似乎没有关键字可以防止自动递增。. .

我还发现我可以使用 SQLITE_OMIT_AUTOINCREMENT compile option 构建 sqlite,但我不想全局禁用该行为,仅针对此特定列。

有趣的是,如果我不包含 PRIMARY KEY 约束,我会得到想要的行为:

sqlite> CREATE TABLE FOO(bar integer NOT NULL);
sqlite> INSERT INTO FOO(bar) VALUES(NULL);
SQL error: foo.bar may not be NULL

如何定义表以便拒绝 NULL 值保留主键约束?

【问题讨论】:

【参考方案1】:

Autoincrement 行为仅适用于声明为 INTEGER PRIMARY KEY 的列。所以禁用它的最简单方法是:

将该列声明为UNIQUE 而不是PRIMARY KEY。 将列类型声明为INT 而不是INTEGER

请注意,任何一个都会为您提供一个具有整数的列affinity,而不是被限制为仅包含整数。

【讨论】:

您可能还希望将 UNIQUE 与 NOT NULL 结合起来,以防止在您的表中创建“空闲”记录。【参考方案2】:

当您需要插入数据时禁用自动增量(重新创建表之外)的一种方法是使用 sqlite3 中的导入工具:

如果你有这样的表:

CREATE TABLE [table1] ( [ID] integer PRIMARY KEY AUTOINCREMENT NOT NULL, [col1] TEXT);

如果您使用数据文件对其运行导入命令:

ID col1
10 abc
20 def

import myfile.txt table1

它将导入行,并忽略自动增量功能。

【讨论】:

至少对我不起作用。使用sqlite3 --version 3.8.10.2 2015-05-20 18:17:19 2ef4f3a5b1d1d0c4338f8243d40a2452cc1f7fe4 测试

以上是关于防止自动递增整数主键?的主要内容,如果未能解决你的问题,请参考以下文章

首先使用代码禁用整数主键上的标识(自动递增)

无法使用 flask-sqlalchemy 创建自动递增主键

防止使用整数进行自动转换

如何防止 OleDbDataReader.ExecuteReader 自动附加整数以复制列值

在oracle 怎样设置自动递增的的字段,也就是设置自动递增的ID 主键

HSQLDB整型key自动递增