20
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 エラーですが、次の理由により何が問題なのかわかりません。

  • foo存在します。
  • foo.rowid存在します。
  • foo.rowidの主キーであるfooため、一意性が制約されます。
  • bar.foo_rowidは 1 列であり、1 列であるという事実と一致しfoo.rowidます。
4

2 に答える 2

6

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

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

ROWID 列を使用して外部参照を作成できます。テーブルにレコードを挿入すると、ROWID 列は自動インクリメント フィールドのように動作します。これが、sqlite が推奨する自動インクリメント フィールドがない理由です。

注: ROWID 列は、タイプが INTEGER で、テーブルの主キーである必要がある場合にのみ呼び出すことができます。

于 2015-12-04T16:12:49.493 に答える