sql >> Databasteknik >  >> RDS >> Mysql

SQLite i Android:Främmande nycklar och förväntas

Ditt problem är att du har blandat ihop column_constraint syntax med table_constraint syntax (dvs. kodade den senare där den förra ska användas ).

Du kan åtgärda problemet genom att använda

db.execSQL("CREATE TABLE " + QUEST_TABLE_NAME + "(id INTEGER primary key autoincrement NOT NULL, name TEXT, description TEXT, expValue INTEGER, category INTEGER NOT NULL REFERENCES categories (id), date TEXT");

Som förklaras nedan liksom den alternativa syntaxen.

Det är kolumnbegränsningssyntaxen som börjar med REFERENCES .... och är en del av kolumndefinitionen (dvs. kolumnnamnet är implicit), medan table_constraint-syntaxen börjar med FORIEGN KEY(column_name) REFERENCES ... och följer kolumndefinitionerna

Så du kan ha antingen :-

Column_constraint-syntax

  • Som en del av en kolumndefinition

  • category INTEGER NOT NULL REFERENCES categories (id)

t.ex.

CREATE TABLE yourtablename (id INTEGER primary key autoincrement NOT NULL, name TEXT, description TEXT, expValue INTEGER, category INTEGER NOT NULL REFERENCES categories (id), date TEXT)

eller

Table_constraint-syntax

  • efter att kolumnerna har definierats, men fortfarande inom kolumndefinitionen, dvs fortfarande inom parentes.

  • FOREIGN KEY (category) REFERENCES categories (id)

t.ex.

CREATE TABLE yourtablename (id INTEGER primary key autoincrement NOT NULL, name TEXT, description TEXT, expValue INTEGER, category INTEGER NOT NULL, date TEXT, FOREIGN KEY (category) REFERENCES categories (id));

Du kan hitta column-constraint och table-constraint användbar.

datum kan vara ett kolumnnamn. Jag skulle dock föreslå att det är klokt att inte använda något SQLite-nyckelord, såsom datum, som kolumnnamn.




  1. Online kontra offline säkerhetskopiering

  2. Beräkna antalet sekunder sedan ett visst datum/tid i SQLite

  3. Antal fredagar mellan två datum

  4. SQLite JSON_PATCH()