NOT NULL 约束不适用于 SQLite android 中的 PRIMARY KEY 列

问题描述 投票:0回答:4

我正在尝试构建一个简单的应用程序,其中不允许用户插入重复的值。

我正在尝试将

Primary Key
作为约束之一,并且
NOT NULL
也是。但
NOT NULL
似乎不起作用。

我已尽力但未能解决。请帮忙

((ID INTEGER NOT NULL PRIMARY KEY)";) 
android database sqlite android-sqlite
4个回答
2
投票

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
值。


0
投票

尝试这种格式:

sqlite> CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

0
投票

在 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 │
└──────┘

-1
投票

尝试在相应字段上使用 UNIQUE 约束。

UNIQUE 约束类似于 PRIMARY KEY 约束,不同之处在于单个表可以具有任意数量的 UNIQUE 约束。对于表上的每个 UNIQUE 约束,每行必须包含由 UNIQUE 约束标识的列中的值的唯一组合。出于 UNIQUE 约束的目的,NULL 值被视为与所有其他值(包括其他 NULL)不同。


编辑:
根据您的附加信息,您可以使用 CHECK 约束来防止空白值。

sqlite> create table foo (bar TEXT, CHECK(bar <> ''));

有关更多信息,请参阅此答案:SQLite 中的非空字符串约束

© www.soinside.com 2019 - 2024. All rights reserved.