Na tej stronie internetowej SQLite mogę znaleźć „wykresy” składniowe, ale nie ma żadnych przykładów, a mój kod ulega awarii. Mam inne tabele z unikalnymi ograniczeniami w jednej kolumnie, ale chcę dodać ograniczenie do tabeli w dwóch kolumnach. To, co mam, powoduje SQLiteException z komunikatem „błąd składni”.
CREATE TABLE name (column defs)
UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE
Robię to na podstawie:
Aby wyjaśnić, w dokumentacji podanego przeze mnie linku jest napisane, że CONTSTRAINT name
powinien on znajdować się przed moją definicją ograniczenia.
Jednak rozwiązaniem może być to, że cokolwiek wynika z moich nawiasowych definicji kolumn, na co narzeka debugger.
Jeśli tak
...last_column_name last_col_datatype) CONSTRAINT ...
błąd jest bliski „CONSTRAINT”: błąd składni
Jeśli tak
...last_column_name last_col_datatype) UNIQUE ...
błąd jest bliski „UNIQUE”: błąd składni
Odpowiedzi:
Umieść deklarację UNIQUE w sekcji definicji kolumny; przykład roboczy:
źródło
ON CONFLICT IGNORE
(jeszcze nie próbowałem zastąpić) z więcej niż 2 kolumnami, ale nie widzę, aby honorowało to wyjątkowe ograniczenie, po prostu wesoło dodaje duplikaty.ON CONFLICT REPLACE
go może nie być tym, czego chcesz - usuwa istniejące wcześniej wiersze, aby umożliwić wstawienie nowego wiersza. Zwykle chciałbym ABORT lub ROLLBACK naruszenie ograniczenia. Klauzula SQLite ON CONFLICTCóż, twoja składnia nie pasuje do dołączonego linku, który określa:
źródło
Uważaj, jak zdefiniujesz tabelę, ponieważ uzyskasz różne wyniki przy wstawianiu. Rozważ następujące
Podczas gdy efekt wstawiania / aktualizacji jest taki sam,
id
zmiany oparte na typie definicji tabeli (patrz druga tabela, w której teraz ma „Alice”id = 4
; pierwsza tabela robi więcej, niż się spodziewam, zachowaj KLUCZ PODSTAWOWY taki sam ). Bądź świadomy tego efektu.źródło
Jeśli masz już tabelę i nie możesz / nie chcesz jej ponownie utworzyć z jakiegokolwiek powodu, użyj indeksów :
źródło