Ik heb twee tabellen die ik aan elkaar wil knopen met een foreign key. De tabellen zien er zo uit:
`classes`
`codes`
Vervolgens maak ik de foreign key aan. Dat doe ik met de query browser, en die probeert de volgende SQL uit te voeren:
En dan krijg ik deze error:
Ik heb al wat rondgezocht en ben erachter gekomen dat het belangrijk schijnt te zijn dat de datatypes van de primary en foreign keys hetzelfde zijn. Dat zijn ze. Ook moeten de collations van beide velden (of tabellen?) hetzelfde zijn. Is ook allemaal zo. Ik zie geen verschillen. Ik kan ook nergens aanwijzingen vinden dat een primary/foreign key combo altijd integer moet zijn, dus CHAR(1) in mijn geval zou gewoon moeten werken (de error zou ook anders moeten zijn als datatypes het probleem was).
En of er nou op codes.class een index staat of niet, maakt niets uit. Ook die ON DELETE en ON UPATE clauses weglaten maakt niets uit. De naam van de foreign key weglaten maakt niets uit. Ook een SHOW CREATE TABLE `codes`; geeft aan dat er niet toevallig al een foreign key op het betreffende veld zit die de query browser niet ziet, dus dat is het probleem ook niet...
Hoe nu verder?
Wat specs:
Windows Server 2008 R2
MySQL 5.1.52-community
Alles is utf8 en utf8_general_ci
Alles is InnoDB
`classes`
`class` | CHAR(1) NOT NULL | (PK) |
`name` | VARCHAR(25) NOT NULL |
`codes`
`class` | CHAR(1) NOT NULL | (indexed) |
`code` | CHAR(5) NOT NULL | |
`name` | VARCHAR(25) NOT NULL |
Vervolgens maak ik de foreign key aan. Dat doe ik met de query browser, en die probeert de volgende SQL uit te voeren:
SQL:
1
2
3
4
5
6
| ALTER TABLE `codes` ADD CONSTRAINT `fk_codes_class` FOREIGN KEY `fk_codes_class` (`class`) REFERENCES `classes` (`class`) ON DELETE RESTRICT ON UPDATE RESTRICT; |
En dan krijg ik deze error:
code:
1
| Can't create table 'db.#sql-518_bc' (errno: 150) |
Ik heb al wat rondgezocht en ben erachter gekomen dat het belangrijk schijnt te zijn dat de datatypes van de primary en foreign keys hetzelfde zijn. Dat zijn ze. Ook moeten de collations van beide velden (of tabellen?) hetzelfde zijn. Is ook allemaal zo. Ik zie geen verschillen. Ik kan ook nergens aanwijzingen vinden dat een primary/foreign key combo altijd integer moet zijn, dus CHAR(1) in mijn geval zou gewoon moeten werken (de error zou ook anders moeten zijn als datatypes het probleem was).
En of er nou op codes.class een index staat of niet, maakt niets uit. Ook die ON DELETE en ON UPATE clauses weglaten maakt niets uit. De naam van de foreign key weglaten maakt niets uit. Ook een SHOW CREATE TABLE `codes`; geeft aan dat er niet toevallig al een foreign key op het betreffende veld zit die de query browser niet ziet, dus dat is het probleem ook niet...
Hoe nu verder?
Wat specs:
Windows Server 2008 R2
MySQL 5.1.52-community
Alles is utf8 en utf8_general_ci
Alles is InnoDB
日本!🎌