Ограничение таблицы SQLite - уникально для нескольких столбцов
Я могу найти синтаксис "диаграммы" на этом сайте 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": синтаксическая ошибка
5 ответов
Поместите объявление 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);
Если у вас уже есть таблица и вы не можете / не хотите воссоздавать ее по какой-либо причине, используйте индексы:
CREATE UNIQUE INDEX my_index ON my_table(col_1, col_2);
Ну, ваш синтаксис не соответствует ссылке, которую вы включили, которая указывает:
CREATE TABLE name (column defs)
CONSTRAINT constraint_name -- This is new
UNIQUE (col_name1, col_name2) 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
изменения в зависимости от типа определения таблицы (см. вторую таблицу, где теперь у "Алисы" id = 4
; первая таблица выполняет больше того, что я ожидаю, оставьте ПЕРВИЧНЫЙ КЛЮЧ неизменным). Помните об этом эффекте.
работать на меня
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)
);