Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[mySQL] Foreign Key

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

  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
Ik weet niet of het in het goede subfora staat, maar ik heb het maar gewoon hier geplaats :)
Ik ben een boek aan het lezen over PHP5&mySQL en ik ben nu bij het hoofdstuk Database (mySQL).
We maken nu een database voor een webshop. Ik heb de tabel Klant, Artikel, Categorie, En nu wil ik de tabel Bestelling maken. Ik ga naar PhpMyAdmin(PMA). Ik lees nog een stukje verder in mijn boek en er staat dat Artikel_ID en Klant_ID FOREIGN KEYS moeten worden. Ik vul alles in. Maar ik zie nergens de optie op Foreigen Key aan te zetten. Weet iemand waar ik dit kan vinden?
En weet iemand dan ook nog of Auto Increment aan moet, of dat dat uit kan blijven.

Alvast bedankt,

Marijn

EDIT : Deze topic hoort dus thuis in Progamering, weet ik dat voor de volgende keer :)


ZIE PROBLEEM ONDER!!!!~!

[ Voor 8% gewijzigd door BlueCola op 24-11-2007 18:25 ]

And that's how one and one makes three.


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-11 22:54
Een foreign key kan geen auto-increment zijn, aangezien de foreign key eigenlijk een verwijzing is naar de primary key uit een andere tabel.
Ik denk dat je wellicht nog niet goed weet wat een foreign key juist behelst, en waarom je dit nodig hebt. Daarom: klik
Een foreign key wordt eigenlijk gemaakt door een foreign-key-constraint te leggen tussen 2 tabellen; een relatie dus eigenlijk.

https://fgheysels.github.io/


  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 27-10 15:31
1e hit google ...
In phpMyAdmin zitten geen foreign keys, ze hebben iets gemaakt wat er een beetje op lijkt : Relation tables...Maar dat staat heel duidelijk uitgelegd in de help-files van PMA.

Wil je daadwerkelijk gebruik gaan maken van FK in je applicaties moet je zorgen dat al je tabellen van het type InnoDb zijn, die ondersteunen namelijk wel foreign keys, in tegenstelling tot MyISAM en Heap.

[ Voor 4% gewijzigd door djexplo op 17-11-2007 11:37 ]

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
whoami schreef op zaterdag 17 november 2007 @ 11:34:
Een foreign key kan geen auto-increment zijn, aangezien de foreign key eigenlijk een verwijzing is naar de primary key uit een andere tabel.
Ik denk dat je wellicht nog niet goed weet wat een foreign key juist behelst, en waarom je dit nodig hebt. Daarom: klik
Een foreign key wordt eigenlijk gemaakt door een foreign-key-constraint te leggen tussen 2 tabellen; een relatie dus eigenlijk.
Ik weet wel wat het inhoud, een relatie tussen 2 tabellen, Maar bij mijn boek staat niet of het auto increment moest zijn, dus ik dacht dat vraag ik ook gelijk maar even. Maar ik kan het dus echt niet vinden hoe je Foreign Key aan zet in PhpMyAdmin.

And that's how one and one makes three.


  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
Heb ik ook gelezen, maar als ik het tabel typen in InnoDB verander maakt het geen bal uit.

And that's how one and one makes three.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Blue-cola schreef op zaterdag 17 november 2007 @ 11:39:
[...]

Heb ik ook gelezen, maar als ik het tabel typen in InnoDB verander maakt het geen bal uit.
Je reageert nu op de tweede gequotete alinea, terwijl voor jou nu juist die eerste alinea opgaat. ;) PMA kan die FK's niet zetten, dat zul je voor zover ik weet handmatig moeten doen met een CREATE TABLE statement. Hoe dat moet staat vast in je boek. ;) Als het goed is kun je ná het aanmaken van de tabellen wel mutaties erop uitvoeren met PMA.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
Ok. Maakt het uit of de tabel Klant het type Mysiam heeft en de tabel Bestelling als type InnoDB?

And that's how one and one makes three.


  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Je zou MySQL-admin kunnen gebruiken om je foreign keys aan te leggen.

Ik gebruik in de praktijk vaak een combinatie van MySQL-admin, phpMyAdmin en gewoon de MySQL-console. Alledrie hebben ze zo hun handigheidjes en onhandigheidjes.

De console kan alles maar niet zo handig, MySQL-admin kan een hoop, maar bijvoorbeeld geen nieuwe kolommen invoegen tussen bestaande. Het heeft wel een prima interface voor het maken van indexen en foreign keys. Het helpt je ook een piepklein beetje bij het maken van views, sp's en functions. Bij phpMyAdmin kan je goed merken dat het niet echt gemaakt is met de moderne MySQL in het hoofd. Transactiesupport is minimaal, foreign keys snapt'ie weinig van, etcetera. Maar het is wel weer handig om een veldje ergens toe te voegen of een record te wijzigen :)

En ja, allebei je tabellen moeten InnoDB zijn voor een FK-relatie, en de velden moeten ook precies hetzelfde zijn. (Let dus op eventuele unsigned attributen enzo :))

[ Voor 8% gewijzigd door eamelink op 17-11-2007 11:56 ]


  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
eamelink schreef op zaterdag 17 november 2007 @ 11:54:
Je zou MySQL-admin kunnen gebruiken om je foreign keys aan te leggen.

Ik gebruik in de praktijk vaak een combinatie van MySQL-admin, phpMyAdmin en gewoon de MySQL-console. Alledrie hebben ze zo hun handigheidjes en onhandigheidjes.

De console kan alles maar niet zo handig, MySQL-admin kan een hoop, maar bijvoorbeeld geen nieuwe kolommen invoegen tussen bestaande. Het heeft wel een prima interface voor het maken van indexen en foreign keys. Het helpt je ook een piepklein beetje bij het maken van views, sp's en functions. Bij phpMyAdmin kan je goed merken dat het niet echt gemaakt is met de moderne MySQL in het hoofd. Transactiesupport is minimaal, foreign keys snapt'ie weinig van, etcetera. Maar het is wel weer handig om een veldje ergens toe te voegen of een record te wijzigen :)

En ja, allebei je tabellen moeten InnoDB zijn voor een FK-relatie, en de velden moeten ook precies hetzelfde zijn. (Let dus op eventuele unsigned attributen enzo :))
Ik kan de knop Download this progam bij Mysql Admin niet vinden. Of de buy knop :P
Laat maar :P Ik heb de buy knop al gevonden, maar ik ga hem niet kopen, Te duur, Dus ik blijf gewoon bij PMA.

[ Voor 4% gewijzigd door BlueCola op 17-11-2007 12:15 ]

And that's how one and one makes three.


  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 19-11 13:44

Spockz

Live and Let Live

De MySQL Admin is gewoon gratis hoor. Alleen voor de multi-instace/-server monitor tool moet je gewoon betalen.
http://dev.mysql.com/downloads/gui-tools/5.0.html

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
Al de tabel types zijn nu InnoDB, maar nu zie ik nog steeds niet hoe ik er een forgein key tussen moet zetten?

And that's how one and one makes three.


  • Coju
  • Registratie: Oktober 2000
  • Niet online
http://dev.mysql.com/doc/...eign-key-constraints.html Hier staat wat je nodig hebt :) In Phpmyadmin gaat dit dus niet.

  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
Topic merged en moved DTE >> PRG
Bij mijn vorige topic is het allemaal gelukt, maar nu heb ik het volgende probleem:

Ik heb 3 tabellen:
code:
1
2
3
CPA
Artikelen
Categorie


De tabel CPA bevat de velden:

code:
1
2
3
CPA_ID(auto increment, primary key)
Artikel_ID(Foreign key)
Categorie_ID(Foreign key)


De tabel Artikelen bevat de volgende velden:

code:
1
2
3
4
Artikel_ID(auto_increment, Primary key)
Naam
omschrijving
Prijs


De tabel Categorie bevat de volgende velden:

code:
1
2
Categorie_ID(Auto increment, Primary Key)
Naam


Nu wil ik bij de tabel CPA het volgende invoegen via PMA:

SQL:
1
2
3
4
5
6
7
8
INSERT INTO `marijntj_bakkerij`.`CPA` (

`Artikel_ID` ,
`Categorie_ID` 
)
VALUES (
'1', '2'
) 


MySQL retourneerde:

code:
1
#1216 - Cannot add or update a child row: a foreign key constraint fails


De bedoeling is dus dat hij artikel id 1 (appeltaart) Aan categorie_ID 2 koppelt (taarten). Alleen geeft hij dus de volgende foutmelding :

MySQL retourneerde:

code:
1
#1216 - Cannot add or update a child row: a foreign key constraint fails


Heeft iemand de oplossing?

Alvast bedankt,

Marijn

[ Voor 5% gewijzigd door RobIII op 18-11-2007 17:20 . Reden: Code tags toegevoegd ]

And that's how one and one makes three.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wat zit er in de categorie tabel? Bestaat daar wel een record met ID 2? En in de artikel tabel staat een record met ID 1?
Zo nee, dan is dat je probleem. Zo ja, dan heb je een fout in je constraints.
Waarom doe je overigens:
code:
1
2
3
4
...
VALUES (
'1', '2'
)

:? Dat suggereert dat of je ID's alfanumeriek zijn, of je query niet klopt:
code:
1
2
3
4
...
VALUES (
1, 2
)

Dat zou dan beter moeten kloppen.

Oh, en als je code/queries post, gebruik dan code tags.

[ Voor 95% gewijzigd door RobIII op 18-11-2007 17:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
Ja allebei de ID's bestaan, Die query maakt ie erzelf van. Ik doe gewoon invoegen bij PMA en dan vul ik alles in. Dus dan heb ik een fout in me constraints, Hoe haal ik die eruit? En hoe zie ik welke fout er in de contraist zit?

And that's how one and one makes three.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Blue-cola schreef op zondag 18 november 2007 @ 18:07:
Hoe haal ik die eruit? En hoe zie ik welke fout er in de contraist zit?
Zoals al vaker aangegeven: wat heb je geprobeerd? Wat heb je gecontroleerd? Wat heb je uberhaupt zelf gedaan? Heb je de constraints al eens bekeken? Wat zie je dan?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Om succesvol te zijn zul je iets meer moeten proberen te bedenken wat je precies wilt, hoe je dat wilt bereiken en wat je precies aan het doen bent in plaats van error-hoppen ;)

Een "foreign key constraint fails", dat is een duidelijke error. Een FK is een simpele constraint, er kan eigenlijk maar één ding misgaan. As je bedenkt wat dat is moet je er best uit kunnen komen :)

  • djiwie
  • Registratie: Februari 2002
  • Laatst online: 26-11 15:25

djiwie

Wie?

In nieuwere versies van phpMyAdmin kun je gelukkig ook relaties aanmaken, zolang je tabellen maar InnoDB zijn en je foreign keys een index hebben :)

  • Fiander
  • Registratie: Februari 2001
  • Laatst online: 28-05 12:35
moest van creepy hier verder gaan ?

dit slaat dus op bvtr vs bvt

je doet een insert op BVTR ?
echter die kollomen die je wilt inserten passen precies bij BVT ?

ben je een bericht aan het plaatsen, of een reactie ?

Deze sig is een manueel virus!! Als je dit leest heb je het. Mail dit bericht naar iedereen die je kent, en verwijder alle bestanden van je computer.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:10

Creepy

Tactical Espionage Splatterer

En voor de volledigheid ook even hier;
Heeft iemand de oplossing?
Ja, maar als we de oplossing compleet voor je voor gaan kauwen dan leer je er niks van.

Dus wat heb je zelf al geprobeerd en wat lukte daar dan niet mee? Alleen een foutmelding dumpen en vragen wie helpt is hier niet de bedoeling. Zie ook Programming Beleid - De Quickstart voor de informatie die we willen zien.

Tip: zorg dat je PK's bestaan voordat je in een tabel met FK's een insert doet. En druk je volledige query eens af voordat deze wordt uitgevoerd zodat je precies weet wat er in je query zit (ook wel: debuggen ;) )

[ Voor 19% gewijzigd door Creepy op 24-11-2007 13:50 ]

"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


  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
Mijn Code ::

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
include "config.php";
if (!isset($_SESSION['bi'])) {
$_SESSION['bi'] = $_GET['bi'];
}
if ($_POST['knop'] && $_POST['Gebruiker'] && $_POST['Berichtje']) {
$sql = "INSERT INTO BVTR (Bericht_ID, Gebruiker, Dag, Reactie, IP) VALUES ('".$_SESSION['bi']."', '".$_POST['Gebruiker']."', NOW(), '".$_POST['Berichtje']."', ' ".$_SERVER['REMOE_ADDR']." ')";
$query = mysql_query($sql) or die("Er is een fout op getreden. Neem contact op met Marijn en meld de volgende foutcode : " . mysql_error());
echo "Reactie is geplaats!";
unset($_SESSION['bi']);
}else{
echo "Hier kun je een reactie toevoegen! Ga niet lopen spammen! En ga niet onder iemand anders naam een reactie plaatsen! Hierop staat een permanente ban!<br />";
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Gebruiker ( Je hoeft je niet aan te melden, je kunt gewoon een naam invullen) : <input type="text" name="Gebruiker" value="Timon" /><br />
Berichtje voor timon : <textarea name="Berichtje" cols="30" rows="10"></textarea><br />
<input type="submit" name="knop" />
</form>
<?php
}
?>


Alleen als ik een reactie toevoeg zegt ie dit:
Cannot add or update a child row: a foreign key constraint fails

Mijn 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
-- phpMyAdmin SQL Dump
-- version 2.10.0.2
-- http://www.phpmyadmin.net
-- 
-- Host: localhost
-- Generatie Tijd: 24 Nov 2007 om 05:03
-- Server versie: 4.1.22
-- PHP Versie: 4.4.2

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

-- 
-- Database: `marijntj_timon`
-- 

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

-- 
-- Tabel structuur voor tabel `BVT`
-- 

CREATE TABLE `BVT` (
  `Bericht_ID` bigint(20) NOT NULL auto_increment,
  `Gebruiker` varchar(50) NOT NULL default '',
  `Dag` datetime NOT NULL default '0000-00-00 00:00:00',
  `Bericht` longtext NOT NULL,
  `IP` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`Bericht_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;

-- 
-- Gegevens worden uitgevoerd voor tabel `BVT`
-- 

INSERT INTO `BVT` VALUES (1, 'Marijn', '2007-11-22 15:41:00', 'Timon, Ik hoop dat je snel weer beter bent en van de IC af komt.\r\nGroeten, Marijn', '');
-- --------------------------------------------------------

-- 
-- Tabel structuur voor tabel `BVTR`
-- 

CREATE TABLE `BVTR` (
  `Reactie_ID` bigint(20) NOT NULL auto_increment,
  `Bericht_ID` bigint(20) NOT NULL default '0',
  `Gebruiker` varchar(50) NOT NULL default '',
  `Dag` datetime NOT NULL default '0000-00-00 00:00:00',
  `Reactie` longtext NOT NULL,
  `IP` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`Reactie_ID`),
  KEY `Bericht_ID` (`Bericht_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- 
-- Gegevens worden uitgevoerd voor tabel `BVTR`
-- 


-- 
-- Beperkingen voor gedumpte tabellen
-- 

-- 
-- Beperkingen voor tabel `BVTR`
-- 
ALTER TABLE `BVTR`
  ADD CONSTRAINT `b_Bericht_ID` FOREIGN KEY (`Bericht_ID`) REFERENCES `BVT` (`Bericht_ID`);


Onder aan zie je ook hoe de constrain is elkaar ziet.

Wie weet de fout?

B.V.D.! Marijn!

And that's how one and one makes three.


  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
Fiander schreef op zaterdag 24 november 2007 @ 13:05:
moest van creepy hier verder gaan ?

dit slaat dus op bvtr vs bvt

je doet een insert op BVTR ?
echter die kollomen die je wilt inserten passen precies bij BVT ?

ben je een bericht aan het plaatsen, of een reactie ?
Dit script is om een ractie te plaatsen bij het bericht.

And that's how one and one makes three.


  • BlueCola
  • Registratie: November 2006
  • Laatst online: 26-09 02:11
Creepy schreef op zaterdag 24 november 2007 @ 13:49:
Dus wat heb je zelf al geprobeerd en wat lukte daar dan niet mee?
Ik heb zelf niet veel kunnen doen, omdat ik geen verstand heb van constraints. Het scriptje om er een foreign key van te maken heb ik van Eamelink gekregen. Ik heb gekeken of alle namen goed stonden. Of ik niet kleinigheden ben vergeten. Gekeken of hij wel naar de goede tabel Referencesde. En dat deed die allemaal. Dus verder weet ik er gewoon helemaal niks van. Ik wil niet de hele oplossing, maar gewoon dat ik wat hints heb om verder te komen ;)

EDIT: Wat ik wel heb gemerkt, dat ie er iets mis gaat met die $_Session. als je Bericht_ID = 1 doet, doet hij het wel gewoon.

[ Voor 22% gewijzigd door BlueCola op 24-11-2007 19:44 ]

And that's how one and one makes three.

Pagina: 1