Foreign key aanmaken
Beste php-ers,
Ik probeer nu al een tijdje een simpele foreign key aan te maken maar steeds krijg ik een errornummer 150 terug van mysql.
Allebei de tabellen zijn leeg en bevatten dus geen records:
Ik voer dit uit:
Vervolgens krijg ik deze error:
#1005 - Can't create table '.\test\#sql-f6c_12af.frm' (errno: 150)
Waarom krijg ik toch die error te zien?
Ik probeer nu al een tijdje een simpele foreign key aan te maken maar steeds krijg ik een errornummer 150 terug van mysql.
Allebei de tabellen zijn leeg en bevatten dus geen records:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `ban` (
`ban_id` int(11) NOT NULL,
`ban_gebruiker_id` int(11) NOT NULL,
PRIMARY KEY (`ban_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `gebruikers` (
`gebruikers_id` int(11) NOT NULL,
PRIMARY KEY (`gebruikers_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
`ban_id` int(11) NOT NULL,
`ban_gebruiker_id` int(11) NOT NULL,
PRIMARY KEY (`ban_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `gebruikers` (
`gebruikers_id` int(11) NOT NULL,
PRIMARY KEY (`gebruikers_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Ik voer dit uit:
Code (php)
1
ALTER TABLE gebruikers ADD FOREIGN KEY(gebruikers_id) REFERENCES ban(ban_gebruikers_id) ON DELETE SET NULL ON UPDATE CASCADE
Vervolgens krijg ik deze error:
#1005 - Can't create table '.\test\#sql-f6c_12af.frm' (errno: 150)
Waarom krijg ik toch die error te zien?
Gesponsorde koppelingen:
Can't create table '.\test\#sql-f6c_12af.frm'
Vind je de tablename niet een beetje vreemd?
Vind je de tablename niet een beetje vreemd?
Nee want die heb ik aangemaakt om te testen. tablename is dus test en heeft 2 tabellen.
Dit is de tabalname die jij blijkbaar wilt createn:
.\test\#sql-f6c_12af.frm
.\test\#sql-f6c_12af.frm
Ik wil helemaal geen tabelname aanmaken. Ik wil een foreign key aanmaken.
op een delete call zet je em op NULL terwijl je fields NOT NULL zijn, kun je de NOT NULL eigenschappen eruithalen en kijken wat ie dan zegt?
Bedankt voor je antwoord maar dat helpt ook helaas niet. Ik blijf dezelfde error krijgen.
Probeer eens MyISAM in plaats van InnoDB. zo werkt ie bij mij wel;
drop table ban;
drop table gebruikers;
CREATE TABLE `ban` (
`ban_id` int(11),
`ban_gebruiker_id` int(11),
PRIMARY KEY (`ban_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `gebruikers` (
`gebruikers_id` int(11),
PRIMARY KEY (`gebruikers_id`),
foreign key (gebruikers_id) references
ban(ban_gebruiker_id) on delete set null on update cascade
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
drop table ban;
drop table gebruikers;
CREATE TABLE `ban` (
`ban_id` int(11),
`ban_gebruiker_id` int(11),
PRIMARY KEY (`ban_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `gebruikers` (
`gebruikers_id` int(11),
PRIMARY KEY (`gebruikers_id`),
foreign key (gebruikers_id) references
ban(ban_gebruiker_id) on delete set null on update cascade
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Nee, je hebt gelijk. Zie eens op http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
Bedankt het werkt. Alleen in die link staat dit:
•Both tables must be InnoDB tables and they must not be TEMPORARY tables.
Dus ik had ze InnoDB gemaakt maar het moet dus MyIsam zijn. Waarom staat er dan InnoDB?
•Both tables must be InnoDB tables and they must not be TEMPORARY tables.
Dus ik had ze InnoDB gemaakt maar het moet dus MyIsam zijn. Waarom staat er dan InnoDB?
MyISAM heeft volgens mij geen foreignkeys.
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
SanThe heeft gelijk InnoDB staat bekend om zijn foreignkey support. Ik ga het uitzoeken en laat het je nog weten HellRazer, als de topic gesloten is PM ik je wel.
Probeer je foreign key eens een naam te geven. InnoDB vereist dat elke foreign key een unieke naam heeft. Anders krijg je dit soort cryptische foutmeldingen.
PS - MyIsam ondersteund sowieso geen FK.
PS2 - Sowieso zit er een typo in je add FK, ban_gebruikers_id.
PS - MyIsam ondersteund sowieso geen FK.
PS2 - Sowieso zit er een typo in je add FK, ban_gebruikers_id.
Gewijzigd op 01/01/1970 01:00:00 door Mark PHP
Quote:
Dat weet ik wel zeker ook. MyISAM slikt zulke queries wel en geeft geen errors o.i.d., maar in werkelijkheid doet ie het gewoon niet.MyISAM heeft volgens mij geen foreignkeys.
@TS:
Jij verwijst nu met een PK naar een FK, terwijl het andersom moet.
ALTER TABLE ban ADD FOREIGN KEY ban_gebruiker_id REFERENCES gebruikers (gebruikers_id) ON DELETE SET NULL ON UPDATE CASCADE;
Wellicht kun je hem een naampje geven, met de bovenstaande geeft MySQL hem zelf een naampje volgens mij:
ALTER TABLE ban ADD CONSTRAINT fk_bans_gebruikers FOREIGN KEY ban_gebruiker_id REFERENCES gebruikers (gebruikers_id) ON DELETE SET NULL ON UPDATE CASCADE;
Hartelijk bedankt voor je post. Ik was er inmiddels ook achter dat ik ze verkeerd om had. Dit is nu allemaal gelukt maar nu rest mij nog enkel 1 probleem, namelijk:
Ik heb een tabel gebruikers met onder andere een kolom:
- gebruikers_id INT Primery Key auto_increment
En ik heb een tabel ban met onder andere 2 kolommen:
- ban_id INT Primery Key auto_increment
- ban_gebruikers_id INT
Nu heb ik de ban_gebruikers_id kolom gekoppeld aan gebruikers_id alleen wil ik dat op moment dat er een gebruiker verwijderd word uit de gebruikerstabel de ban_gebruikers_id in de ban tabel op NULL word gezet.
Alleen ik krijg dat niet voor elkaar omdat de gebruikers_id een NOT NULL eigenschap heeft omdat deze de Primery Key is en de eigenschap auto_increment heeft.
Wat moet ik hieraan doen?
Edit: ik heb het voor elkaar gekregen. Kon hem gewoon aanpassen.
Ik heb een tabel gebruikers met onder andere een kolom:
- gebruikers_id INT Primery Key auto_increment
En ik heb een tabel ban met onder andere 2 kolommen:
- ban_id INT Primery Key auto_increment
- ban_gebruikers_id INT
Nu heb ik de ban_gebruikers_id kolom gekoppeld aan gebruikers_id alleen wil ik dat op moment dat er een gebruiker verwijderd word uit de gebruikerstabel de ban_gebruikers_id in de ban tabel op NULL word gezet.
Alleen ik krijg dat niet voor elkaar omdat de gebruikers_id een NOT NULL eigenschap heeft omdat deze de Primery Key is en de eigenschap auto_increment heeft.
Wat moet ik hieraan doen?
Edit: ik heb het voor elkaar gekregen. Kon hem gewoon aanpassen.
Gewijzigd op 01/01/1970 01:00:00 door Zero XT
HellRazer, je kunt het record toch verwijderen ? Als de van uitgeschakeld wordt kun je de ban_gebruiker record logischerwijs weggooien toch ?
Jan Willem bedankt voor de post
Jan Willem bedankt voor de post
Ik ben weer een stuk wijzer geworden. Bedankt voor jullie hulp allemaal.



