'Why am I getting a SQLite "foreign key mismatch" error when executing script below?
CREATE TABLE Zuliefererkooperiertmitzulieferer(Unternehmensnamen1 VARCHAR(80) NOT NULL CHECK(Unternehmensnamen1 NOT GLOB "*[^A-Za-z]*" AND length(Unternehmensnamen1)>0),
Unternehmensnamen2 VARCHAR(80) NOT NULL CHECK(Unternehmensnamen2 NOT GLOB "*[^A-Za-z]*" AND length(Unternehmensnamen2)>0
AND (Unternehmensnamen1 NOT LIKE Unternehmensnamen2)),
PRIMARY KEY (Unternehmensnamen1,Unternehmensnamen2),
FOREIGN KEY (Unternehmensnamen1) REFERENCES Zulieferer(Unternehmensname)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (Unternehmensnamen2) REFERENCES Zulieferer(Unternehmensname)
ON DELETE CASCADE
ON UPDATE CASCADE);
CREATE TABLE Zulieferer(Email VARCHAR(80) NOT NULL COLLATE NOCASE CHECK(length(Email)>0 AND Email LIKE "%@%.%" AND
substr(Email,1,(instr(Email,"@")-1)) NOT GLOB "*[^A-Za-z0-9]*" AND
substr(Email,(instr(Email,"@")+1),(instr(Email,".")-instr(Email,"@")-1))NOT GLOB "*[^A-Za-z0-9]*" AND
substr(Email,(instr(Email,".")+1))NOT GLOB "*[^A-Za-z]*"),
Unternehmensname VARCHAR(80) NOT NULL CHECK(Unternehmensname NOT GLOB "*[^A-Za-z]*" AND length(Unternehmensname)>0),
PRIMARY KEY (Email),
FOREIGN KEY (Email) REFERENCES Nutzer(Email)
ON DELETE CASCADE
ON UPDATE CASCADE);
Solution 1:[1]
Master table should be created before detail table. Why? Because detail table's column references master table's primary key. If master table doesn't exist yet, there's nothing to reference.
Furthermore, as I said, foreign key is supposed to reference a primary key in another table. You're referencing columns that aren't primary key, so - that won't work.
Solution 2:[2]
You need to create the table first before using it as foreign key
CREATE TABLE Zuliefererkooperiertmitzulieferer(Unternehmensnamen1 VARCHAR(80) NOT NULL CHECK(Unternehmensnamen1 NOT GLOB "[^A-Za-z]" AND length(Unternehmensnamen1)>0), Unternehmensnamen2 VARCHAR(80) NOT NULL CHECK(Unternehmensnamen2 NOT GLOB "[^A-Za-z]" AND length(Unternehmensnamen2)>0 AND (Unternehmensnamen1 NOT LIKE Unternehmensnamen2)), PRIMARY KEY (Unternehmensnamen1,Unternehmensnamen2), FOREIGN KEY (Unternehmensnamen1) REFERENCES Zulieferer(Unternehmensname) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (Unternehmensnamen2) REFERENCES Zulieferer(Unternehmensname) ON DELETE CASCADE ON UPDATE CASCADE);
CREATE TABLE Zulieferer(Email VARCHAR(80) NOT NULL COLLATE NOCASE CHECK(length(Email)>0 AND Email LIKE "%@%.%" AND substr(Email,1,(instr(Email,"@")-1)) NOT GLOB "[^A-Za-z0-9]" AND substr(Email,(instr(Email,"@")+1),(instr(Email,".")-instr(Email,"@")-1))NOT GLOB "[^A-Za-z0-9]" AND substr(Email,(instr(Email,".")+1))NOT GLOB "[^A-Za-z]"), Unternehmensname VARCHAR(80) NOT NULL CHECK(Unternehmensname NOT GLOB "[^A-Za-z]" AND length(Unternehmensname)>0), PRIMARY KEY (Email), FOREIGN KEY (Email) REFERENCES Nutzer(Email) ON DELETE CASCADE ON UPDATE CASCADE);'
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Littlefoot |
| Solution 2 | Jens |
