[解決済み] Foreign Key Mismatchエラーの原因は何ですか?
質問
次のような構造のsqliteデータベースがあります。
CREATE TABLE IF NOT EXISTS Patient
( PatientId INTEGER PRIMARY KEY AUTOINCREMENT );
CREATE TABLE IF NOT EXISTS Event
(
PatientId INTEGER REFERENCES Patient( PatientId ),
DateTime TEXT,
EventTypeCode TEXT,
PRIMARY KEY( PatientId, DateTime, EventTypeCode )
);
CREATE TABLE IF NOT EXISTS Reading
(
PatientId INTEGER REFERENCES Patient( PatientId ),
DateTime TEXT REFERENCES Event (DateTime),
EventTypeCode TEXT REFERENCES Event (EventTypeCode),
Value REAL,
PRIMARY KEY( PatientId, DateTime, EventTypeCode )
);
ID #1 の患者を挿入します。
を実行します。
INSERT INTO Event (PatientId, DateTime, EventTypeCode) VALUES (1, '2011-01-23 19:26:59', 'R')
どの作品
を実行します。
INSERT INTO Reading (PatientId, DateTime, EventTypeCode, Value) VALUES (1, '2011-01-23 19:26:59', 'R', 7.9)
で、外部キーの不一致が発生します。 患者IDはすべて「1」で、2番目と3番目のクエリではdatetimeとtypecodeが一致しています。私は何がミスマッチなのか理解できませんが、実際に外部キーを定義するのは少し初めてなので、何が間違っているのか分かりません。
どのように解決するのですか?
SQLiteには詳しくないのですが、ちょっとググってみると こんなのが出てきました。 . ドキュメントによると
データベーススキーマに が必要な外部キーエラー 複数のテーブルを見る を識別するために、そのような は検出されません。 テーブルが作成されます。その代わり、そのような エラーは、アプリケーションが を変更するSQLステートメントを準備する。 子または親のコンテンツが テーブルを使用する方法で、外部 キーになります。コンテンツがある場合に報告されるエラー はDMLエラーとなります。 スキーマが変更されたときに報告される は"DDLエラー"です。つまり、言い換えれば 外部キー制約の設定ミス 子プロセスの両方を参照する必要があります。 と親はDMLエラーです。 英語版 のエラーメッセージは、外部キー DMLエラーは通常、"外部キー を使用します。 となることもありますが、"no such 親テーブルが存在しない場合は、そのテーブルを使用します。 が存在します。外部キーDMLエラーは である が報告されている場合。
- 親テーブルが存在しない、または
- 外部キー制約で指定された親キーカラムが存在しない。 または
- 外部キー制約で指定された親キーカラムが 親テーブルの主キーと 一意性制約の対象外である で指定された照合順序を使用して を実行するか、または、CREATE TABLE
- 子テーブルが親の主キーを参照し、その主キーは 主キーカラムの指定と の主キーカラムの数が の数と一致しない。 子キーカラムを使用します。
その中で3番に当たる可能性があるのでは?
また、他のDBでは一意でないインデックスを外部キー参照として使用することをサポートしている場合がありますが、( 回答はこちら )ですが、私の意見では、これは悪い設計上の選択です。私なら、以下のどちらかを行うように再構築します。
-
Reading.PatientId
参考文献Event.PatientId
から完全なコンポジットキーが得られるようにEvent
が参照するのはReading
または -
を追加します。
EventId
に自動インクリメントの主キーを設定します。Event
テーブルの外部キーとして使用します。Reading
テーブルを作成します(そうすればEventId
とValue
下Reading
を取得することができます。PatientId, DateTime, EventTypeCode
のうちEvent
).
の冗長性を避けるために、2をお勧めします。
PatientId, DateTime
と
EventTypeCode
の両方で
Event
と
Reading
.
関連
-
[解決済み】SQLが単一グループのグループ関数でないこと
-
[解決済み】使用されるSELECT文は列の数が異なる(REDUX!)
-
[解決済み】単一のクエリで加重平均を計算する
-
[解決済み] ORA-00920: 無効な関係演算子
-
[解決済み] SQL Server - INNER JOIN WITH DISTINCT
-
[解決済み] トリガーがコンパイルエラーで作成される
-
[解決済み] T-SQLを使用して外部キー制約を一時的に無効にするにはどうすればよいですか?
-
[解決済み] 外部キー制約のあるテーブルを切り捨てるには?
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 列名または提供された値の数がテーブル定義と一致しない
-
[解決済み】PL/SQL SELECTに複数のCOUNT(DISTINCT xxx)を指定すると、予期しない結果になる。
-
[解決済み】SQLが単一グループのグループ関数でないこと
-
[解決済み】SQL Serverは「集約関数やサブクエリを含む式に対して集約関数を実行できない」が、Sybaseはできる。
-
[解決済み] INSERT ステートメントが FOREIGN KEY 制約と競合する - SQL Server
-
[解決済み] ORA-01790: 式は、対応する式と同じデータ型でなければならないエラーが発生するケース
-
[解決済み] ORA-04063: ビューにエラーがあります
-
[解決済み] ORA-01821: ISO 8601 のローカルタイム付き日付のフォーマットが認識されないエラー
-
[解決済み] 時間を時間単位や10分単位でグループ化する方法
-
[解決済み] 1行目4列目(年)の一括読み込みデータ変換エラー(型の不一致または指定したコードページに対して無効な文字)