2013-06-08 4 views
7
SQLite version 3.7.9 2011-11-01 00:52:41 
sqlite> PRAGMA foreign_keys = 1; 
sqlite> CREATE TABLE foo(name); 
sqlite> CREATE TABLE bar(foo_rowid REFERENCES foo(rowid)); 
sqlite> INSERT INTO foo VALUES('baz'); 
sqlite> SELECT rowid, name FROM foo; 
1|baz 
sqlite> INSERT INTO bar (foo_rowid) VALUES (1); 
Error: foreign key mismatch 

Dlaczego ten błąd występuje? Jest to DML error, ale nie wiem, co się stało, ponieważ:Dlaczego odwoływanie się do wiersza polecenia SQLite powoduje niezgodność klucza obcego?

  • foo istnieje.
  • foo.rowid istnieje.
  • foo.rowid jest kluczem podstawowym foo i dlatego jest ograniczony do wyjątkowości.
  • bar.foo_rowid to jedna kolumna, która odpowiada faktowi, że foo.rowid jest jedną kolumną.

Odpowiedz

13

dokumentacji SQLite jest całkiem jasne kluczy obcych:

The parent key must be a named column or columns in the parent table, not the rowid. 

(Zobacz here.)

Nie można używać rowid na to, więc po prostu zdefiniować własne auto zwiększający klucz podstawowy dla stół.

+2

A nawet można nazwać PK 'rowid'. –

+1

Mam błąd z informacją: _ niepoprawny klucz niezgodny - "child_table" odwołujący się do "parent_table" _. Zrobiłem to, co powiedziałeś, ale nadal nie działa. –

+0

Z drugiej strony, 'Jeśli tabela zawiera kolumnę typu INTEGER PRIMARY KEY, wówczas ta kolumna staje się aliasem dla ROWID." Z https: //www.sqlite. org/autoinc.html –

2

Nie można używać rowid jeśli nie określono w tabeli, ale jeśli ją zdefiniować następująco:

CREATE TABLE IF NOT EXISTS Clase(
ROWID INTEGER NOT NULL, 
nombre VARCHAR(50) NOT NULL, 
PRIMARY KEY(ROWID)); 

kolumna ROWID mogą zostać wykorzystane do odniesienia zagranicznych, a po wstawieniu rekordu do tabela, kolumna ROWID zachowuje się jak pole autoinkrementacji, dlatego te polecane sqlite nie mają pól autoincrement.

Uwaga: Kolumna ROWID może być wywołana tylko w przypadku typu INTEGER i klucza podstawowego tabeli.

Powiązane problemy