[MySQL] errno: 150 probleem

Pagina: 1
Acties:
  • 1.752 views sinds 30-01-2008
  • Reageer

  • matel
  • Registratie: Februari 2004
  • Laatst online: 06-03 20:40
Ik ben bezig om relaties te leggen in een mysql database. Alleen loop ik heel de tijd tegen een hardnekkig probleem aan. Heb o.a dit topic gevonden: [rml][ MySQL] Error 1005 Can't create table (errno: 150)[/rml] maar dat werkt ook niet. Met google wordt ik ook niet veel wijzer.

Situatie

We maken een website waarop de klant auto's en onderdelen kan bestellen. Dit wordt gemaakt in php/mysql.

Alles gaat uit van de klant. De klant heeft één of meer orders. Op de order kunnen meerdere onderdelen en/of autos staan.

Ik gebruik mysql 4.0.23. Die zou dit alles zonder problemen moeten ondersteunen.

SQL

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `klant` (
  `klant_ID` int(10) unsigned NOT NULL auto_increment,
  `k_voornaam` varchar(45) NOT NULL default '',
  `k_achternaam` varchar(45),
  `k_straat` varchar(50),
  `k_postcode` varchar(10),
  `k_woonplaats` varchar(50),
  `k_telefoon` int(10) unsigned,
  `k_geboortedatum` date,
  PRIMARY KEY  (`klant_ID`),
  INDEX (`klant_ID`)
) ENGINE=InnoDB;


SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE `verkoper` (
   `verkoper_ID` int(10) unsigned NOT NULL auto_increment,
   `v_voornaam` varchar(45) NOT NULL default '',
   `v_achternaam` varchar(45),
   `v_straat` varchar(50),
   `v_postcode` varchar(10),
   `v_woonplaats` varchar(45),
   `v_telefoon` int(10) unsigned,
   `v_geboortedatum` date,
   `v_functie` varchar(45),
   `v_afdeling` varchar(45),
   `v_indienst` date,
   `v_uitdienst` date,
   `v_sofinummer` int(10),
  PRIMARY KEY (`verkoper_ID`),
  INDEX (`verkoper_ID`)
) ENGINE=InnoDB;


Er bestaat ook nog een tabel autos en artikelen die op dezelfde manier in elkaar steken. De problemen beginnen bij de tabellen order en orderregels.

SQL:
1
2
3
4
5
6
7
8
9
CREATE TABLE `order` (
   `order_ID` int(10) unsigned NOT NULL auto_increment,
   `FK_klant_ID` int(10),
   `FK_verkoper_ID` int(10),
   PRIMARY KEY (`order_ID`),
   INDEX (`order_ID`),
   KEY `FK_verkoper` (`FK_verkoper_ID`)
   CONSTRAINT `klt` FOREIGN KEY (`FK_klant_ID`) REFERENCES `klant` (`klant_ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;


SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE `orderregels` (
   `FK_order_ID` int(10),
   `FK_auto_ID` int(10),
   `FK_artikel_ID` int(10),
   `or_aantal` int(3),
   `or_au_prijs` int(7),
   `or_ar_prijs` int(7),
   `or_btw` int(2),
   `or_k_voornaam` varchar(45),
   `or_k_achternaam` varchar(45),
   `or_k_postcode` varchar(10),
   `or_k_woonplaats` varchar(45),
   KEY `FK_order` (`FK_order_ID`),
   KEY `FK_auto` (`FK_auto_ID`),
   KEY `FK_artikel` (`FK_artikel_ID`),
   CONSTRAINT `ord` FOREIGN KEY (`FK_order_ID`) REFERENCES `order` (`order_ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;


Volgens phpmyadmin is het beter om geen primary key icm index te gebruiken, maar volgens mij is dat wel nodig om het te laten werken? Wie ziet waar ik de mist in ga?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Een PK betekent automatisch dat er ook een index opzit. Dus zelf een index erop zetten is overbodig.
Ik gok erop dat MySQL klaagt omdat je geen INDEX op je FK hebt liggen (op FK_klant_ID bijv.). Maar zoek die error 150 eens op in de MySQL manual, dat vertelt je waarschijnlijk een stuk meer

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Om je database goed te designen kan je ook dit gebruiken

http://www.fabforce.net/dbdesigner4/ (gratis)

Dan weet je iig of je de FK's etc goed hebt

[ Voor 6% gewijzigd door Verwijderd op 07-06-2005 13:52 ]


  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

error 150 : MySQL error: 150 = Foreign key constraint is incorrectly formed

Bij http://dev.mysql.com/doc/...i-diff-foreign-keys.html] staat ook een andere syntax vermeld.

Verwijderd

code:
1
`FK_klant_ID` int(10),


code:
1
`klant_ID` int(10) unsigned NOT NULL auto_increment,


- De eerste is signed, terwijl de tweede unsigned is.
- Je moet zorgen dat je index'es hebt op de foreign keys :).

En ja, mySQL mag daar wat verbose'r zijn wbt foutmeldingen

[ Voor 16% gewijzigd door Verwijderd op 07-06-2005 16:35 ]


  • matel
  • Registratie: Februari 2004
  • Laatst online: 06-03 20:40
Erg bedankt zover. Ik ben zover dat de tabellen zonder problemen toegevoegd worden aan de database. Ik gebruik trouwens als hulp het programma MySQL Query Browser. Dat andere programma (dbdesigner4) heeft meer mogelijkheden, maar loopt helaas vaak vast bij mij.

Wat ik nu wil weten is of ik alles op de juiste manier doe. Maak ik bijvoorbeeld niet onnodig of verkeerd gebruik van KEY of zou ik FOREIGN KEY moeten gebruiken. Dat is namelijk nog nieuw voor mij en ik zou het graag goed willen hebben.

Moet ik bijvoorbeeld in de tabel "klant" ook nog dit opnemen:
CONSTRAINT `klant_ibfk_1` FOREIGN KEY (`klant_ID`) REFERENCES `order` (`FK_klant_ID`) ON DELETE CASCADE ON UPDATE CASCADE;
en dan natuurlijk de primairy keys van de andere tabellen ook op zo'n manier koppelen?

Hier heb ik de tabellen order en orderregels nog eens een keer.

code:
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `order` (
   `order_ID` int(10) unsigned NOT NULL auto_increment,
   `FK_klant_ID` int(10) unsigned,
   `FK_verkoper_ID` int(10) unsigned,
   PRIMARY KEY (`order_ID`),
   INDEX (`FK_klant_ID`),
   INDEX (`FK_verkoper_ID`),
   KEY `FK_klant` (`FK_klant_ID`),
   KEY `FK_verkoper` (`FK_verkoper_ID`),
   CONSTRAINT `klt` FOREIGN KEY (`FK_klant_ID`) REFERENCES `klant` (`klant_ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE `orderregels` (
   `FK_order_ID` int(10) unsigned,
   `FK_auto_ID` int(10) unsigned,
   `FK_artikel_ID` int(10) unsigned,
   `or_aantal` int(3) unsigned,
   `or_au_prijs` int(7) unsigned,
   `or_ar_prijs` int(7) unsigned,
   `or_btw` int(2) unsigned,
   `or_k_voornaam` varchar(45),
   `or_k_achternaam` varchar(45),
   `or_k_postcode` varchar(10),
   `or_k_woonplaats` varchar(45),
   INDEX (`FK_order_ID`),
   INDEX (`FK_auto_ID`),
   INDEX (`FK_artikel_ID`),
   KEY `FK_order` (`FK_order_ID`),
   KEY `FK_auto` (`FK_auto_ID`),
   KEY `FK_artikel` (`FK_artikel_ID`),
   CONSTRAINT `ord` FOREIGN KEY (`FK_order_ID`) REFERENCES `order` (`order_ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;


edit: Oke... Ik merk dat de relaties nog niet helemaal kloppen. Ik kan namelijk een order aan een verkoper koppelen zonder dat die verkoper bestaat. Er zullen ook wel dingen misgaan als het koppelen van een niet bestaande auto of artikel aan een orderregel. Ook bestaan er dubbele indexen. Als je een key aanmaakt wordt dat automatisch een index volgens mij. Dat moet nog opgelost worden dus.

[ Voor 25% gewijzigd door matel op 07-06-2005 22:26 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Nofi maaruh, als je niet weet of je (primary) key of FOREIGN KEY moet gaan gebruiken dan wordt het denk ik eens tijd voor een echte database tutorial (keyword: normaliseren).

Je hebt inderdaad nu wat mis zitten met je relaties. Je hebt blijkbaar wel door dat verkoperID een Foreign KEY is (in de naamgeving gebruik je FK) maar vervolgens leg je niet vast dat het een foreign key is. Ik krijg zelfs het idee dat je niet eens een tabel met verkopers hebt.

Maar echt: zoek eens op "normaliseren" of "database normalisatie". Dan wordt uitgelegd hoe je nu tot een databasemodel met betreffende relaties komt. Dan weet je ook meteen het verschil tussen een primary key en een foreign key. Indexen komen in principe later pas als je weet hoe je de verschillende tabellen gaat benaderen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • matel
  • Registratie: Februari 2004
  • Laatst online: 06-03 20:40
Het verschil tussen primairy keys en foreign keys zijn helemaal duidelijk voor mij. Alleen hoe ik dat moet vastleggen in mysql is nieuw en onbekend voor mij. Ik krijg het bijvoorbeeld wel zonder problemen voor elkaar in Access, maar dat is toch heel wat makkelijker :)

  • matel
  • Registratie: Februari 2004
  • Laatst online: 06-03 20:40
Ik kan me vergissen, maar volgens mij heb ik het nu goed. Hier een dump van de hele database.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
-- phpMyAdmin SQL Dump
-- version 2.6.1
-- http://www.phpmyadmin.net
-- 
-- Host: localhost
-- Generatie Tijd: 07 Jun 2005 om 22:46
-- Server versie: 4.1.9
-- PHP Versie: 4.3.10
-- 
-- Database: `loopink`
-- 

-- --------------------------------------------------------

-- 
-- Tabel structuur voor tabel `artikelen`
-- 

CREATE TABLE `artikelen` (
  `artikel_ID` int(10) unsigned NOT NULL auto_increment,
  `ar_merk` varchar(45) default NULL,
  `ar_type` varchar(45) default NULL,
  `ar_soort` varchar(45) default NULL,
  `ar_prijs` int(7) unsigned default NULL,
  `ar_afbeelding` varchar(100) default NULL,
  PRIMARY KEY  (`artikel_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- 
-- Gegevens worden uitgevoerd voor tabel `artikelen`
-- 


-- --------------------------------------------------------

-- 
-- Tabel structuur voor tabel `autos`
-- 

CREATE TABLE `autos` (
  `auto_ID` int(10) unsigned NOT NULL auto_increment,
  `au_merk` varchar(45) default NULL,
  `au_type` varchar(45) default NULL,
  `au_model` varchar(45) default NULL,
  `au_bouwjaar` date default NULL,
  `au_KMstand` int(6) unsigned default NULL,
  `au_transmissie` varchar(45) default NULL,
  `au_brandstof` varchar(45) default NULL,
  `au_kleur` varchar(45) default NULL,
  `au_aantal_deuren` varchar(45) default NULL,
  `au_APK` varchar(100) default NULL,
  `au_extra_opties` text,
  `au_nieuwprijs` int(7) unsigned default NULL,
  `au_prijs` int(7) unsigned default NULL,
  `au_gewicht` int(5) unsigned default NULL,
  `au_grijs_kenteken` enum('ja','nee') default NULL,
  `au_kenteken` varchar(10) default NULL,
  `au_afbeelding` varchar(100) default NULL,
  PRIMARY KEY  (`auto_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- 
-- Gegevens worden uitgevoerd voor tabel `autos`
-- 


-- --------------------------------------------------------

-- 
-- Tabel structuur voor tabel `klant`
-- 

CREATE TABLE `klant` (
  `klant_ID` int(10) unsigned NOT NULL auto_increment,
  `k_voornaam` varchar(45) NOT NULL default '',
  `k_achternaam` varchar(45) default NULL,
  `k_straat` varchar(50) default NULL,
  `k_postcode` varchar(10) default NULL,
  `k_woonplaats` varchar(50) default NULL,
  `k_telefoon` int(10) unsigned default NULL,
  `k_geboortedatum` date default NULL,
  PRIMARY KEY  (`klant_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- 
-- Gegevens worden uitgevoerd voor tabel `klant`
-- 


-- --------------------------------------------------------

-- 
-- Tabel structuur voor tabel `order`
-- 

CREATE TABLE `order` (
  `order_ID` int(10) unsigned NOT NULL auto_increment,
  `FK_klant_ID` int(10) unsigned default NULL,
  `FK_verkoper_ID` int(10) unsigned default NULL,
  PRIMARY KEY  (`order_ID`),
  KEY `FK_klant_ID` (`FK_klant_ID`),
  KEY `FK_verkoper_ID` (`FK_verkoper_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- 
-- Gegevens worden uitgevoerd voor tabel `order`
-- 


-- --------------------------------------------------------

-- 
-- Tabel structuur voor tabel `orderregels`
-- 

CREATE TABLE `orderregels` (
  `FK_order_ID` int(10) unsigned default NULL,
  `FK_auto_ID` int(10) unsigned default NULL,
  `FK_artikel_ID` int(10) unsigned default NULL,
  `or_aantal` int(3) unsigned default NULL,
  `or_au_prijs` int(7) unsigned default NULL,
  `or_ar_prijs` int(7) unsigned default NULL,
  `or_btw` int(2) unsigned default NULL,
  `or_k_voornaam` varchar(45) default NULL,
  `or_k_achternaam` varchar(45) default NULL,
  `or_k_postcode` varchar(10) default NULL,
  `or_k_woonplaats` varchar(45) default NULL,
  KEY `FK_order_ID` (`FK_order_ID`),
  KEY `FK_auto_ID` (`FK_auto_ID`),
  KEY `FK_artikel_ID` (`FK_artikel_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- 
-- Gegevens worden uitgevoerd voor tabel `orderregels`
-- 


-- --------------------------------------------------------

-- 
-- Tabel structuur voor tabel `verkoper`
-- 

CREATE TABLE `verkoper` (
  `verkoper_ID` int(10) unsigned NOT NULL auto_increment,
  `v_voornaam` varchar(45) NOT NULL default '',
  `v_achternaam` varchar(45) default NULL,
  `v_straat` varchar(50) default NULL,
  `v_postcode` varchar(10) default NULL,
  `v_woonplaats` varchar(45) default NULL,
  `v_telefoon` int(10) unsigned default NULL,
  `v_geboortedatum` date default NULL,
  `v_functie` varchar(45) default NULL,
  `v_afdeling` varchar(45) default NULL,
  `v_indienst` date default NULL,
  `v_uitdienst` date default NULL,
  `v_sofinummer` int(10) unsigned default NULL,
  PRIMARY KEY  (`verkoper_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- 
-- Gegevens worden uitgevoerd voor tabel `verkoper`
-- 


-- 
-- Beperkingen voor gedumpte tabellen
-- 

-- 
-- Beperkingen voor tabel `order`
-- 
ALTER TABLE `order`
  ADD CONSTRAINT `klt` FOREIGN KEY (`FK_klant_ID`) REFERENCES `klant` (`klant_ID`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `order_ibfk_2` FOREIGN KEY (`FK_verkoper_ID`) REFERENCES `verkoper` (`verkoper_ID`) ON DELETE CASCADE ON UPDATE CASCADE;

-- 
-- Beperkingen voor tabel `orderregels`
-- 
ALTER TABLE `orderregels`
  ADD CONSTRAINT `orderregels_ibfk_2` FOREIGN KEY (`FK_artikel_ID`) REFERENCES `artikelen` (`artikel_ID`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `ord` FOREIGN KEY (`FK_order_ID`) REFERENCES `order` (`order_ID`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `orderregels_ibfk_1` FOREIGN KEY (`FK_auto_ID`) REFERENCES `autos` (`auto_ID`) ON DELETE CASCADE ON UPDATE CASCADE;
Pagina: 1