Ограничение таблицы SQLite - уникально для нескольких столбцов

145

Я могу найти синтаксические "диаграммы" на этом на веб-сайте SQLite, но примеров и моего кода не происходит. У меня есть другие таблицы с уникальными ограничениями для одного столбца, но я хочу добавить ограничение к таблице в двух столбцах. Это то, что у меня есть, что вызывает SQLiteException с сообщением "синтаксическая ошибка".

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

Я делаю это на основе следующего:

table-constraint

Чтобы быть ясным, документация по предоставленной ссылке говорит, что CONTSTRAINT name должен появиться перед моим определением ограничения.

Что-то, что может привести к решению, заключается в том, что все, что следует за моими определениями столбцов в столбцах, является тем, о чем жалуется отладчик.

Если я поставлю

...last_column_name last_col_datatype) CONSTRAINT ...

ошибка рядом с "CONSTRAINT": синтаксическая ошибка

Если я поставлю

...last_column_name last_col_datatype) UNIQUE ...

ошибка рядом с "UNIQUE": синтаксическая ошибка

  • 1
    УНИКАЛЬНЫЙ пропускает запятую, прежде чем она начнется ..
Теги:
unique-constraint
compound-key

2 ответа

281
Лучший ответ

Поместите объявление 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);
  • 5
    Хороший ответ +1. Позволяет ли этот синтаксис использовать обычный метод вставки, а не insertWithOnConflict с флагом SQLiteDatabase.CONFLICT_REPLACE?
  • 3
    Я использую ON CONFLICT IGNORE (еще не пробовал заменить) с более чем 2 столбцами, но я не вижу, чтобы он соблюдал уникальное ограничение, он просто весело добавляет дубликаты.
Показать ещё 2 комментария
6

Ну, ваш синтаксис не соответствует указанной вами ссылке, которая указывает:

 CREATE TABLE name (column defs) 
    CONSTRAINT constraint_name    -- This is new
    UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE
  • 0
    Я изначально сделал это ... не сработало. Я попробовал это снова на всякий случай ... все еще не работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню