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

このエラーはなぜ発生しますか?それはDML errorですが、ので、私は間違っているのか分からない:SQLiteのROWIDを参照すると、外部キーの不一致が発生するのはなぜですか?

  • fooが存在します。
  • foo.rowidが存在します。
  • foo.rowidは、fooの主キーであり、したがって一意性に制約されます。
  • bar.foo_rowidは1列であり、foo.rowidが1列であることに一致します。

答えて

13

SQLiteのドキュメントは、外部キーには非常に明確である:

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

あなたはこのためrowidを使用することはできません

、(hereを参照してください。)これだけの主キーをインクリメント独自の自動定義テーブル。

あなたのテーブルで定義されていない場合は、ROWIDを使用することはできませんが、次のようにあなたがそれを定義した場合
+2

そして、そのPKの名前は 'rowid'でも可能です。 –

+1

私は、次のようなエラーがあります:_foreign key mismatch - "parent_table" _を参照する "child_table"。私はあなたが言ったが、まだ動作していない.. –

+0

一方、 'テーブルにINTEGER PRIMARY KEY型のカラムが含まれている場合、そのカラムはhttps://www.sqliteのROWIDのエイリアスになります。 org/autoinc.html –

2

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

をROWID列が外国の参照を作るために使用することができ、あなたがにレコードを挿入テーブルのROWID列はautoincrementフィールドのように動作するため、推奨されるsqliteには自動インクリメントフィールドがありません。

注:ROWID列は、INTEGER型および表の主キーでなければなりません。

関連する問題