Toon posts:

[MySQL] Foreign keys

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik ben al een tijdje aan het klooien met foreign keys in MySQL. Op de een of andere manier lukt het nooit zoals ik het graag wil en ik ben er ook vast van overtuigd dat dit aan mij zal liggen. Hoewel ik al met meerdere gelijksoortige problemen te maken heb gehad, zal ik het probleem uit leggen aan de hand van het volgende voorbeeld:

Ik heb twee tabellen in MySQL gedefinieerd aan de hand van onderstaande definities:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE `Person` (
    personId SMALLINT,
    name TINYTEXT NOT NULL,
    email TINYTEXT,
    dateOfBirth DATE,

    PRIMARY KEY (personId)
)


CREATE TABLE `Game` (
    gameId SMALLINT,
    dateBegin DATE NOT NULL,
    dateEnd DATE,

    PRIMARY KEY (gameId)
)

Tussen de 2 bovenstaande tabellen hoort een relatietabel die ik als volgt heb gedefinieerd:
SQL:
1
2
3
4
5
6
7
8
9
CREATE TABLE `PersonNumbers` (
    personId SMALLINT,
    gameId SMALLINT,
    number SMALLINT NOT NULL,

    PRIMARY KEY (personId, gameId),
    FOREIGN KEY (personId) REFERENCES `Person` (personid),
    FOREIGN KEY (gameId) REFERENCES `Game` (gameId)
)

De bedoeling is dus dat er alleen entries in de tabel `PersonNumbers` komen die ook daadwerkelijk bestaan in de `Person` en `Game` tabellen. Het vreemde is nu dat er verder geen foutmelding wordt gegenereerd door phpMyAdmin (ik voer de queries in in phpMyAdmin) en het lijkt dan ook dat de bovenstaande tabeldefinities goed zijn gelukt.

Het is echter zo dat de tabel `PersonNumbers` alle entries toestaat, ook al bestaat er geen bijbehorende `Person` of `Game` niet. Ook bij het bekijken van de database dump, zijn de foreign key definities niet aanwezig. De primary keys doen het allemaal wel goed.

Heeft er iemand een idee wat het probleem kan zijn? Nogmaals, het is niet de eerste keer dat ik tegen dit probleem aanloop in phpMyAdmin.

Alvast mijn hartelijke dank!!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 09-03 19:32

Cloud

FP ProMod

Ex-moderatie mobster

Misschien een overbodige reactie, maar je hebt ze toch wel als InnoDB gecreëerd? MyISAM kent vooralsnog (komt misschien in volgende versie!) geen foreign keys namelijk.. En geeft daarbij geen foutmelding, maar negeert de foreign key constraint.

Overigens heb ik hier ook problemen mee. Het lukt me wel als ik via een ALTER TABLE query toevoeg aan een tabel inmiddels, maar dan nog.. Het werkt een beetje onpraktisch soms, is mijn ervaring :)

Als ik me nog iets bedenk hoor je t van me.

Misschien keyword "CONSTRAINT" toevoegen voor de foreign key? Schiet me net te binnen :)

edit:

linkje over InnoDB en foreign keys in MySQL :)

[ Voor 33% gewijzigd door Cloud op 07-03-2006 19:23 . Reden: linkje ]

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


  • George
  • Registratie: Maart 2006
  • Laatst online: 02-03-2025
Je "create table" SQL gebruikt geen table type definition, dus hij wordt default op MyISAM gezet. Kies specifiek INNODB:

SQL:
1
2
3
4
5
6
7
8
CREATE TABLE `Person` (
    personId SMALLINT,
    name TINYTEXT NOT NULL,
    email TINYTEXT,
    dateOfBirth DATE,

    PRIMARY KEY (personId)
) TYPE = innodb;

[ Voor 51% gewijzigd door George op 07-03-2006 19:22 ]

-George.


Verwijderd

Topicstarter
Grr, dat ik daar zelf niet opgekomen.

Mensen, hartelijk dank. Mijn foreign keys werken nu als ik het in de tabel definities zet. Ook heb ik en extra knop 'Relation view' gekregen in phpMyAdmin waarmee ik kolommen aan elkaar kan koppelen (dus ook het instellen van foreign keys).

Nogmaal mijn dank!