我正在尝试构建一个简单的应用程序,其中不允许用户插入重复的值。
我正在尝试将
Primary Key
作为约束之一,并且 NOT NULL
也是。但NOT NULL
似乎不起作用。
我已尽力但未能解决。请帮忙
((ID INTEGER NOT NULL PRIMARY KEY)";)
SQLite 允许在
NULL
列中使用 PRIMARY KEY
值,除非列是 INTEGER PRIMARY KEY
列,或者表是 WITHOUT ROWID
表,或者列被定义为 NOT NULL
列。
例如:
CREATE TABLE suppliers(
supplier_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
因为此列被声明为
INTEGER PRIMARY KEY
,所以它不会接受 NULL
值。
尝试这种格式:
sqlite> CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
在 SQLite 中,您不能仅将
NULL
添加到 INTEGER PRIMARY KEY
和 INTEGER PRIMARY KEY AUTOINCREMENT
列。
例如,您创建带有
test
列的 id
表,其中包含 INTEGER PRIMARY KEY
或 INTEGER PRIMARY KEY AUTOINCREMENT
,如下所示:
CREATE TABLE test (
id INTEGER PRIMARY KEY
);
或者:
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT
);
然后,您插入 2 行,其中
NULL
为 id
列,如下所示:
INSERT INTO test (id) VALUES (NULL);
INSERT INTO test VALUES (NULL);
现在,添加数字
1
和2
来代替NULL
,如下所示:
.headers on
.mode box
.nullvalue NULL
SELECT * FROM test;
┌────┐
│ id │
├────┤
│ 1 │
│ 2 │
└────┘
此外,您还创建了
test
表,其中包含 id
列,其中包含 TEXT PRIMARY KEY
,如下所示:
CREATE TABLE test (
id TEXT PRIMARY KEY
);
然后,您插入 2 行,其中
NULL
为 id
列,如下所示:
INSERT INTO test (id) VALUES (NULL);
INSERT INTO test VALUES (NULL);
现在添加
NULL
,如下所示:
.headers on
.mode box
.nullvalue NULL
SELECT * FROM test;
┌──────┐
│ id │
├──────┤
│ NULL │
│ NULL │
└──────┘
尝试在相应字段上使用 UNIQUE 约束。
UNIQUE 约束类似于 PRIMARY KEY 约束,不同之处在于单个表可以具有任意数量的 UNIQUE 约束。对于表上的每个 UNIQUE 约束,每行必须包含由 UNIQUE 约束标识的列中的值的唯一组合。出于 UNIQUE 约束的目的,NULL 值被视为与所有其他值(包括其他 NULL)不同。
编辑:
根据您的附加信息,您可以使用 CHECK 约束来防止空白值。
sqlite> create table foo (bar TEXT, CHECK(bar <> ''));
有关更多信息,请参阅此答案:SQLite 中的非空字符串约束