I have an sqlite database structured as follows:
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 )
);
I insert a Patient with Id #1
then I run:
INSERT INTO Event (PatientId, DateTime, EventTypeCode) VALUES (1, '2011-01-23 19:26:59', 'R')
which works
then I run:
INSERT INTO Reading (PatientId, DateTime, EventTypeCode, Value) VALUES (1, '2011-01-23 19:26:59', 'R', 7.9)
and it gives me a foreign key mismatch. Patient Id is ‘1’ in all cases, and the datetime and typecodes match in the 2nd and 3rd queries. I do not understand what is mismatching, but I’m a bit new to actually defining foreign keys and i do not know what I am doing wrong.
I’m not familiar with SQLite but a little Google’ing turned up this. The documentation says
I suspect you might be running into #3 in that list.
Also, while other DBs might support using a non-unique index as a foreign key reference, (see answers here), it’s a bad design choice in my opinion. I would restructure so that either
Reading.PatientIdreferencesEvent.PatientIdso that the complete composite key fromEventis referenced byReadingor,EventIdauto-increment, primary key to theEventtable and use that as the foreign key in theReadingtable (so that you only haveEventIdandValueunderReadingand you can get thePatientId, DateTime, EventTypeCodeout ofEvent).I’d suggest #2 so that you can avoid the redundancy of
PatientId, DateTimeandEventTypeCodein bothEventandReading.