2013-06-08 10 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 

Perché si verifica questo errore? Si tratta di una DML error, ma non so cosa c'è di sbagliato in quanto:Perché il riferimento a un rowid SQLite causa una mancata corrispondenza della chiave esterna?

  • foo esiste.
  • foo.rowid esiste.
  • foo.rowid è la chiave primaria di foo e pertanto vincolata all'unicità.
  • bar.foo_rowid è una colonna, che corrisponde al fatto che foo.rowid è una colonna.

risposta

13

documentazione SQLite è molto chiaro su chiavi esterne:

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

(Vedi here.)

Non è possibile utilizzare rowid per questo, quindi basta definire il proprio auto incremento chiave primaria per la tavola.

+2

Ed è persino possibile nominare tale PK 'rowid'. –

+1

Ho un errore che dice: _prima mancata corrispondenza della chiave - "child_table" che fa riferimento a "parent_table" _. Ho fatto quello che hai detto ma ancora non funziona .. –

+0

D'altra parte, 'Se una tabella contiene una colonna di tipo INTEGER PRIMARY KEY, allora quella colonna diventa un alias per ROWID. Da https: //www.sqlite. org/autoinc.html –

2

Non è possibile utilizzare ROWID se non definito nella tabella, ma se si definisce come segue:

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

La colonna ROWID può essere usato per fare riferimenti stranieri, e quando si inserisce un record nella tabella, la colonna ROWID si comporta come un campo autoincrement, ed è per questo che sqlite raccomandato non ha campi di autoincremento.

Nota: la colonna ROWID può essere richiamata altrimenti deve essere solo di tipo INTEGER e chiave primaria della tabella.

Problemi correlati