SQLite 表约束-多列上的唯一约束

我可以在 SQLite 网站上找到语法“图表”,但是没有示例,我的代码崩溃了。我还有一些对单列具有唯一约束的表,但是我想对两列的表添加一个约束。这就是导致 SQLiteException 出现消息“语法错误”的原因。

CREATE TABLE name (column defs)
UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE

我这么做是基于以下原因:

表-约束”rel = “ noReferrer”> table-約束

需要说明的是,我提供的关于链接的文档指出,CONTSTRAINT name应该出现在约束定义之前。

但是,可能导致解决方案的一些因素是,我用括号括起来的列定义之后的内容正是调试器所抱怨的。

如果我把

...last_column_name last_col_datatype) CONSTRAINT ...

错误是 语法错误

如果我把

...last_column_name last_col_datatype) UNIQUE ...

错误是 接近“ UNIQUE”: 语法错误

115374 次浏览

你的语法和包含的链接不匹配,链接指定:

 CREATE TABLE name (column defs)
CONSTRAINT constraint_name    -- This is new
UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE

将 UNIQUE 声明放在列定义部分中; 工作示例:

CREATE TABLE a (
i INT,
j INT,
UNIQUE(i, j) ON CONFLICT REPLACE
);

注意如何定义表,因为在插入时会得到不同的结果




CREATE TABLE IF NOT EXISTS t1 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT);
INSERT INTO t1 (a, b) VALUES
('Alice', 'Some title'),
('Bob', 'Palindromic guy'),
('Charles', 'chucky cheese'),
('Alice', 'Some other title')
ON CONFLICT(a) DO UPDATE SET b=excluded.b;
CREATE TABLE IF NOT EXISTS t2 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT, UNIQUE(a) ON CONFLICT REPLACE);
INSERT INTO t2 (a, b) VALUES
('Alice', 'Some title'),
('Bob', 'Palindromic guy'),
('Charles', 'chucky cheese'),
('Alice', 'Some other title');


$ sqlite3 test.sqlite
SQLite version 3.28.0 2019-04-16 19:49:53
Enter ".help" for usage hints.
sqlite> CREATE TABLE IF NOT EXISTS t1 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT);
sqlite> INSERT INTO t1 (a, b) VALUES
...>     ('Alice', 'Some title'),
...>     ('Bob', 'Palindromic guy'),
...>     ('Charles', 'chucky cheese'),
...>     ('Alice', 'Some other title')
...>     ON CONFLICT(a) DO UPDATE SET b=excluded.b;
sqlite> CREATE TABLE IF NOT EXISTS t2 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT, UNIQUE(a) ON CONFLICT REPLACE);
sqlite> INSERT INTO t2 (a, b) VALUES
...>     ('Alice', 'Some title'),
...>     ('Bob', 'Palindromic guy'),
...>     ('Charles', 'chucky cheese'),
...>     ('Alice', 'Some other title');
sqlite> .mode col
sqlite> .headers on
sqlite> select * from t1;
id          a           b
----------  ----------  ----------------
1           Alice       Some other title
2           Bob         Palindromic guy
3           Charles     chucky cheese
sqlite> select * from t2;
id          a           b
----------  ----------  ---------------
2           Bob         Palindromic guy
3           Charles     chucky cheese
4           Alice       Some other titl
sqlite>

虽然插入/更新的效果是相同的,但是 id会根据表定义类型进行更改(参见第二个表,其中‘ Alice’现在拥有 id = 4; 第一个表正在做更多我期望它做的事情,保持 PRIMARY KEY 不变)。注意这个效应。

如果您已经有了一个表,并且由于某种原因不能/不想重新创建它,那么使用 索引:

CREATE UNIQUE INDEX my_index ON my_table(col_1, col_2);

为我工作

create table projects (
_id integer primary key autoincrement,
project_type text not null,
name text not null,
description text,
last_updated datetime default current_timestamp,
date_created datetime default current_timestamp,
unique (project_type, name)
);