防止自动增量整数主键?

时间:2013-06-11 20:28:09

标签: sql sqlite primary-key auto-increment notnull

我有一个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,但我不想禁用全局行为,仅针对此特定列。< / p>

有趣的是,如果我不包含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值保持主键约束?

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:-2)

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

如果您有这样的表:

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

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

ID col1
10 abc
20 def

import myfile.txt table1

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