login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Relaties tussen tabellen ophalen (Opgelost)

Offline Abbas - 13/01/2010 17:57
Avatar van AbbasGouden medaille

Crew .NET
Stel ik heb een tabel "Personen" met in die tabel een kolom "GemeenteId". Daarnaast ook een tabel "Gemeente" met dan een Id-kolom en een kolom met de namen ervan. Dus op de kolom "GemeenteId" staat dan een Foreign Key naar de Primary Key kolom van de tabel "Gemeente".

Is er een of ander SQL statement dat ervoor zorgt dat ik dan die relatie kan ophalen? Zo ja, hoe?

17 antwoorden

Gesponsorde links
Offline Ontani - 13/01/2010 18:05 (laatste wijziging 13/01/2010 18:05)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Spreken we over mssql of over mysql? Mssql kan je normaal in de sys tabellen alles vinden.

http://doc.ddart.net/mssql/sql70/sys_00.htm @ sysforeignkeys
Offline cloudstrife - 13/01/2010 18:05
Avatar van cloudstrife PHP beginner http://www.artf...rytree.php

Kijk eens bij "Database metadata" misschien is dit wat je zoekt.

Het is toch voor mysql eh?
Offline lemoinet - 13/01/2010 18:05
Avatar van lemoinet PHP gevorderde JOINS
Offline Abbas - 13/01/2010 18:49
Avatar van Abbas Gouden medaille

Crew .NET
Het is inderdaad voor MySQL en niet MS SQL, vergeten vermelden.. 

@lemoinet: het gaat hem mij niet om de waardes die in de tabel zitten. Ik moet de relaties ophalen tussen tabellen, als die er zijn.

Ik heb in MySQL even een test database gemaakt om eens te testen: klik. Maar als ik dan die database metadat query's uitvoer krijg ik telkens geen resultaten terug. Terwijl er op de afbeelding duidelijk te zien is dat de tabel sales twee "link-kolommen" heeft..
Offline marten - 13/01/2010 19:12
Avatar van marten Beheerder
Citaat:
Posted by Steven Szelei on June 28 2004 5:54pm [Delete] [Edit]
I was looking for a way to show the relationship of tables based on unique key, key, index, and foreign key constraints. I found that I can get some of the data using the admin statement SHOW INDEX FROM <<TBL>>. However this will give only the index name and the Column_name in the table that I am requesting from. I then did a SHOW CREATE TABLE <<TBL>> and this dumps the DDL script used to create the table. I would have to parse this information but could get everything I needed. I then found that SHOW TABLE STATUS LIKE <<TBL>> gave me The REFER information mapped to the column name. Unfortunatlly it did so in the Comments field as a string so uh! more parsing. This is what I have been able to discover so far and am still looking for a clean way to gather key, index, and constraint information to dynamically build table relationships. Also I noticed that the constraint names set in the DDL have not been preserved and mysql has given the constraints their own names. Names given keys are preserved. you can see this by running the show create table <<TBL>> on any table you have set constraints on.
Offline Abbas - 13/01/2010 20:47
Avatar van Abbas Gouden medaille

Crew .NET
En? Ik kan hier geen werkend SQL statement uit krijgen.. 
Offline Richard - 13/01/2010 21:21
Avatar van Richard Crew algemeen
  1. SELECT * FROM information_schema.REFERENTIAL_CONSTRAINTS
  2. WHERE CONSTRAINT_SCHEMA = 'jouw_db'
  3. AND 'jouw_tabel' IN(TABLE_NAME, REFERENCED_TABLE_NAME)


Zoiets? :-)
Offline Abbas - 13/01/2010 21:38 (laatste wijziging 13/01/2010 21:39)
Avatar van Abbas Gouden medaille

Crew .NET
Ik versta wat deze query zou moeten doen maar als ik hem dan run krijg ik enkel dit terug:
MySQL schreef:
MySQL gaf een lege resultaat set terug (0 rijen). ( Query duurde 0.0008 sec )
Nochtans, zoals je kan zien op de afbeelding zijn er relaties tussen de tabellen. Kan dit zijn doordat de relaties pas gelegde zijn na het maken van de tabellen? Want als ik volgende query uitvoer:

  1. SHOW CREATE TABLE person

Dan staat hier nergens een CONSTRAINT-regel bij in het resultaat.
Offline Richard - 13/01/2010 21:40
Avatar van Richard Crew algemeen Dat zou niet moeten uitmaken, maar zijn het wel InnoDB tabellen? Op MyISAM werkt het sowieso niet. 
Offline Abbas - 13/01/2010 21:46 (laatste wijziging 13/01/2010 21:53)
Avatar van Abbas Gouden medaille

Crew .NET
Even kijken, dat weet ik niet vanbuiten! 

Edit:
De tabellen waren inderdaad van het type MyISAM. Ik heb de tabellen nu veranderd van type naar InnoDB maar ik krijg nog altijd geen resultaat terug van die query die je gaf.
Offline Ontani - 13/01/2010 21:54
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
normaal kan je toch niet eens relaties leggen als het MyISAM tabellen zijn?
Offline Richard - 13/01/2010 21:55
Avatar van Richard Crew algemeen Ontani: je kunt ze prima leggen, ze worden alleen nooit afgedwongen. Weer een van de zovele mankementen van MySQL...

titjes: heb je de constraints al opnieuw proberen te leggen? Dat helpt wel eens..

In elk geval is het information_schema wel redelijk betrouwbaar, als daar geen relaties staan "zijn ze er niet".
Offline Abbas - 13/01/2010 22:03
Avatar van Abbas Gouden medaille

Crew .NET
Dus stel ik wil database informatie zoals die relaties tussen tabellen van een database waar ik niets aan kan wijzigen, dan kan ik ze ook nooit "vinden" aangezien de constraints er niet zijn, juist?

Edit:
Hoe voeg ik een FK constraint toe?  
Offline Richard - 13/01/2010 22:08
Avatar van Richard Crew algemeen
  1. ALTER TABLE tabel
  2. ADD FOREIGN KEY (kolom_van)
  3. REFERENCES tabel_naam (kolom_naar)


Zo ongeveer. :-)

N.b.: het information_schema is geen "gewone" database. Het is een systeemcatalogus waarin je (in een standard-compliant DBMS) alle informatie over je "relaties" (tabellen, views, stored procedures e.d.) kunt vinden.

Nou weet ik niet hoever het bij MySQL reikt, ik gebruik het bijna nooit, maar deze query heb ik getest op draaiende tabellen en ik kreeg de relaties prima terug.

  1. SHOW DATABASES; -- information_schema staat er tussen
  2.  
  3. SHOW TABLES FROM information_schema; -- rondkijken maar :-)
Bedankt door: Abbas
Offline Abbas - 13/01/2010 22:18 (laatste wijziging 13/01/2010 22:18)
Avatar van Abbas Gouden medaille

Crew .NET
Dat van information_schema wist ik inderdaad ook, maar het is omdat ik daar niets vond dat ik mij vragen begon te stellen.. 

De query die je gaf werkt perfect en ik krijg 2 resultaten terug (ik heb het AND gedeelte weggelaten want ik moet alle relaties hebben). Maar is er ook een manier om dan de kolom op te halen want in het resultaat zit enkel de tabel naar waar de FK verwijst.
Offline Richard - 13/01/2010 22:21
Avatar van Richard Crew algemeen Ik heb gekeken maar ik kon dat niet zo snel vinden... Mijn advies: gewoon alle tabellen in information_schema bij langs lopen.. Iets anders weet ik niet, ik ben een PostgreSQL-man, geen MySQL'er :-)
Bedankt door: Abbas
Offline Abbas - 13/01/2010 22:24 (laatste wijziging 13/01/2010 22:27)
Avatar van Abbas Gouden medaille

Crew .NET
Ok, geen enkel probleem. Je bent in ieder geval al heel erg bedankt! 

Edit:
Ik heb het kunnen vinden met volgende query:

  1. SELECT *
  2. FROM `KEY_COLUMN_USAGE`
  3. WHERE `TABLE_SCHEMA` = 'test'
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.185s