MySQL relaties opzetten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Stefke
  • Registratie: December 2000
  • Laatst online: 19-09 19:48
Ik weet niet of dit in het juiste forum zit, wel zit ik met een paar vragen:

Ik heb veel ervaring met MsAccess-dbs, maar ik moet een trapje "hoger". Ik wil beginnen met een MySQL server om daar mijn frontends aan te hangen en daar kom ik niet helemaal uit.

MySQL-server draait, phpmyadmin werkt, MySQLWorkbench ook. Wat ik niet aan de praat krijg zijn relaties.

Ik heb deze guide gevolgd:
http://wiki.phpmyadmin.net/pma/pmadb

De tabellen voor pmadb zijn aangemaakt in een database "phpmyadmin", w.o. een tabel "pma_relation"

De config (.../phpmyadmin/config.inc.php) verwijst naar:
code:
1
2
3
4
5
6
/* User for advanced features */
// $cfg['Servers'][$i]['controluser'] = 'root';
// $cfg['Servers'][$i]['controlpass'] = 'zzzzzz';
/* Advanced phpMyAdmin features */
// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
// $cfg['Servers'][$i]['relation'] = 'pma_relation';


Ik heb - tijdelijk? - hier de rootuser + password neergezet (niet zzzz), maar dan stopt het.

Onderaan phpmyadmin staat een melding:
Extra opties om met tabellen te werken, die gelinkt zijn, zijn uitgeschakeld. Om te weten te komen waarom klik hier
Als ik klik staat er:
$cfg['Servers'][$i]['pmadb'] ... Niet Goed [ Documentatie ]
$cfg['Servers'][$i]['relation'] ... Niet Goed [ Documentatie ]
Basis relatie opties: Uitgeschakeld
etcetc voor alle andere tabellen uit deze pma-db.

Deze melding lijkt aan te geven dat de config niet goed staat ingesteld, aangezien pmadb en relation niet de db/tabellen zijn die ik heb aangemaakt? Maar mijn config verwijst volgens mij niet "pmadb" maar naar "phpmyadmin", en naar "pma_relaties"

Als ik op Documentatie klik dan kom ik op
$cfg['Servers'][$i]['pmadb'] string
The name of the database containing the linked-tables infrastructure.

See the Linked-tables infrastructure section in this document to see the benefits of this infrastructure, and for a quick way of creating this database and the needed tables.

If you are the only user of this phpMyAdmin installation, you can use your current database to store those special tables; in this case, just put your current database name in $cfg['Servers'][$i]['pmadb']. For a multi-user installation, set this parameter to the name of your central database containing the linked-tables infrastructure.
Als ik een EER-model maak met Workbench voor 2 simpele tabellen met een relatie dan werkt het niet..

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
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `Lexlumen` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `Lexlumen` ;

-- -----------------------------------------------------
-- Table `Lexlumen`.`relaties`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `Lexlumen`.`relaties` (
  `idrelaties` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `naam` TEXT NULL ,
  PRIMARY KEY (`idrelaties`) )
ENGINE = InnoDB;

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

-- Table `Lexlumen`.`inschrijvingen`

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

CREATE  TABLE IF NOT EXISTS `Lexlumen`.`inschrijvingen` (
  `idinschrijvingen` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `inschriving` VARCHAR(45) NULL ,
  `relatieID` INT NULL ,
  PRIMARY KEY (`idinschrijvingen`) ,
  INDEX `relatieID` () ,
  CONSTRAINT `relatieID`
    FOREIGN KEY ()
    REFERENCES `Lexlumen`.`relaties` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;


Ik krijg deze foutmelding bij het forward engineeren:
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
Executing SQL script in server

ERROR: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ,
  CONSTRAINT `relatieID`
    FOREIGN KEY ()
    REFERENCES `Lexlumen`.`relat' at line 9
-- -----------------------------------------------------
-- Table `Lexlumen`.`inschrijvingen`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `Lexlumen`.`inschrijvingen` (
  `idinschrijvingen` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `inschriving` VARCHAR(45) NULL ,
  `relatieID` INT NULL ,
  PRIMARY KEY (`idinschrijvingen`) ,
  INDEX `relatieID` () ,
  CONSTRAINT `relatieID`
    FOREIGN KEY ()
    REFERENCES `Lexlumen`.`relaties` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

SQL script execution finished: statements: 6 succeeded, 1 failed


De tabel relaties is aangemaakt, de tabel inschrijvingen niet.

Ik heb de relatie alléén gedefinieerd als een FK naar tabel relaties, vanuit de specs van de tabel inschrijvingen. In het EER-model lijkt dat er goed uit te zien, maar vanuit de tabel relaties is niets van de relatie te zien....is dat goed?

Dus twee vragen:
- waarom gaat mijn configuratie niet goed
- maak ik de relatie op de juiste manier aan?

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Sowieso moet het type van je foreign key veld hetzelfde zijn als het veld waar je naar verwijst.

Maar verder lijkt de gegenereerde syntax beetje b0rked. Ik ken workbench verder niet, maar ik kan me voorstellen dat je bij dit soort dingen geen enkel leeg veldje over mag slaan, zodat alle lege plekjes ingevuld worden. Onderstaande werkt namelijk wel

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE  TABLE IF NOT EXISTS `Lexlumen`.`relaties` (
  `idrelaties` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `naam` TEXT NULL ,
  PRIMARY KEY (`idrelaties`) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `Lexlumen`.`inschrijvingen` (
  `idinschrijvingen` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `inschriving` VARCHAR(45) NULL ,
  `relatieID` INT UNSIGNED NULL ,
  PRIMARY KEY (`idinschrijvingen`) ,
  INDEX `relatieID` (relatieID) ,
  CONSTRAINT `relatieID`
    FOREIGN KEY (relatieID)
    REFERENCES `Lexlumen`.`relaties` (idrelaties)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Let op de ingevulde naam van de CONSTRAINT, de ingevulde kolom bij de INDEX, het gerefereerde veld bij de REFERENCES en de toevoeging van UNSIGNED op de spec van het relatieID veld.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Stefke
  • Registratie: December 2000
  • Laatst online: 19-09 19:48
Hmm...bedankt voor je reply, maar ik kan het nu niet meer uitproberen. Heb alles eraf gegooid en ben het opnieuw aan het installeren (ook meteen een beetje oefening :) )

Ik kom er nu achter - middels één of andere php-cursus-site - dat de regels m.b.t. PMA in de config niet actief zijn ("//")... vermoedelijk is dat de oorzaak van de foutmeldingen die ik gepost had, maar dat ga ik zo maar uitproberen :) De "verkeerde" waarden kwamen ws. uit de defaultconfig omdat ze niet uit de manual config gehaald werden.

Je leert met vallen en opstaan :)


edit: dat was inderdaad de oorzaak. Geen foutmeldingen meer in PMA en het is nu wel gelukt om een paar simpele tabellen te maken met een relatie. Nog niet met Workbench maar dat gaat ongetwijfeld wel lukken.

[ Voor 26% gewijzigd door Stefke op 13-04-2011 22:29 ]


Acties:
  • 0 Henk 'm!

  • Stefke
  • Registratie: December 2000
  • Laatst online: 19-09 19:48
Toch nog een vraag, het testje van een relatie tussen twee tabellen dat letterlijk van die website afkwam werkte, maar mijn eigen browsel niet:

2 tabellen:

Inschrijvingen
- IDinschr, Int(10), PK, AI
- datum, Date
- IdRel, Int(10), index

Relaties
- IDrel, In(10), PK, AI
- datum, Date

Nu wil ik een N-1 relatie leggen van Inschrijven.IDrel naar Relaties.IDRel (relaties kunnen zich vaker inschrijven) maar hij accepteert het niet. Het is vast iets stoms maar mijn nog zeer beperkte ervaring met MySQL zit me in de weg.
Fout bij het maken van vreemdesleutel naar idrelaties (controleer data typen)

Fout
ALTERTABLE`inschrijvingen`ADDFOREIGNKEY (`idrelaties`)REFERENCES`Lexlumen`.`relaties` (
`idrelaties`
) ONDELETECASCADEONUPDATECASCADE ;
De datatypen zijn toch gelijk? Als er meer info nodig is hoor ik t graag

Ik vind net de grafische editor :) :>
Afbeeldingslocatie: http://www.stefijn.com/index.php?cmd=image&sfpg=YW5vbnltb3VzL3BpY3Nfb25saW5lLypyZWxhdGllcy5wbmcqMzE0MGNlMDM5NDY0M2Y0MTY0MWFhMWE4ODg1YTA1Mzk

[ Voor 88% gewijzigd door Stefke op 13-04-2011 23:28 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Zit er wel een index op de idrelaties kolom in de tabel inschrijvingen? Bij innodb is het nodig dat je foreign key én referenced keys indexes hebben (maar volgens mij maakt mysql er automatisch een index van).

Verder moeten de datatype exact hetzelfde zijn. Dus qua type, sign en lengte.

Acties:
  • 0 Henk 'm!

  • Stefke
  • Registratie: December 2000
  • Laatst online: 19-09 19:48
Ja, dat heb ik begrepen. Volgens mij zit ie er op:

code:
1
2
3
4
Indexen: Documentatie
Sleutelnaam Type    Unieke waarde   Gecomprimeerd   Veld    Kardinaliteit   Collatie    Null    Opmerking
PRIMARY     BTREE   Ja          Nee         idinschrijvingen    1   A       
idrelaties   BTREE  Nee         Nee         idrelaties  1   A   YES

[ Voor 9% gewijzigd door Stefke op 14-04-2011 10:23 ]


Acties:
  • 0 Henk 'm!

  • Stefke
  • Registratie: December 2000
  • Laatst online: 19-09 19:48
Heb alles weer opnieuw aangemaakt (dwz. de testdb met een paar testtabellen) en nu lukt het wel. Oorzaak was waarschijnlijk dat de tabellen niet als InnoDB waren aangemaakt (dat is niet default) en dat is voor zover ik na kan gaan vereist voor het werken met FKs

Acties:
  • 0 Henk 'm!

  • DEiE
  • Registratie: November 2006
  • Laatst online: 13:39
stefijn schreef op woensdag 13 april 2011 @ 22:01:
Ik kom er nu achter - middels één of andere php-cursus-site - dat de regels m.b.t. PMA in de config niet actief zijn ("//")... vermoedelijk is dat de oorzaak van de foutmeldingen die ik gepost had, maar dat ga ik zo maar uitproberen :) De "verkeerde" waarden kwamen ws. uit de defaultconfig omdat ze niet uit de manual config gehaald werden.
Even ter verdere uitleg, de taal waarin deze variabelen staan is php, en binnen php maak je van een regel commentaar als je hier een dubbele slash voor zet, dus de "//". Door de dubbele slash voor de variabelen te zetten maak je hiervan commentaar en worden deze niet meegenomen
Pagina: 1