我可以在SQLite网站上找到关于此的语法“图表”,但没有示例和我的代码崩溃。我在单个列上有其他具有唯一约束的表,但我想在两列上向表添加约束。这就是我所遇到的SQLiteException,其中包含消息“语法错误”。
CREATE TABLE name (column defs)
UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE
我是根据以下内容做的:
要明确的是,我提供的链接上的文档说CONTSTRAINT name
应该在我的约束定义之前。
可能导致解决方案的一点是,我的括号列定义后面的内容是调试器抱怨的内容。
如果我把
...last_column_name last_col_datatype) CONSTRAINT ...
错误靠近“CONSTRAINT”:语法错误
如果我把
...last_column_name last_col_datatype) UNIQUE ...
错误接近“UNIQUE”:语法错误
答案 0 :(得分:331)
将UNIQUE声明放在列定义部分中:
CREATE TABLE name (column defs, UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE);
工作示例:
CREATE TABLE a (i INT, j INT, UNIQUE(i, j) ON CONFLICT REPLACE);
答案 1 :(得分:9)
嗯,您的语法与您包含的链接不匹配,后者指定:
CREATE TABLE name (column defs)
CONSTRAINT constraint_name -- This is new
UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE
答案 2 :(得分:5)
如果您已经有一个表并且由于某种原因不能/不想重新创建它,请使用indexes:
CREATE UNIQUE INDEX my_index ON my_table(col_1, col_2);
答案 3 :(得分:0)
请注意如何定义表,因为插入时会得到不同的结果。考虑以下
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
会根据表定义类型而变化(请参见第二个表,其中“爱丽丝”现在具有id = 4
;第一个表在完成以下操作:我期望它做什么,请保持主键不变)。请注意这种影响。