Avatar billede kviller Novice
28. december 2006 - 14:41 Der er 11 kommentarer og
2 løsninger

Oprette Forreign Key (FK)

Her er de databaser jeg vil oprette, men jeg har lidt problemer da jeg ikke har den store erfaring med det.

opskrift
--------
id (PK) - INTEGER
navn - VARCHAR(50)
oprettet - DATETIME
kilde - VARCHAR(200)

ingrediens
----------
id (PK) - INTEGER
navn - VARCHAR(50)

maengde
-------
opskriftid (delt PK & FK) - INTEGER
ingrediensid (delt PK & FK) - INTEGER
maengde - INTEGER
enhed - VARCHAR(10)


Jeg kender langt fra alle kommandoer, men har gjort sådan her:

CREATE TABLE `maengde` (
`ID` INT NOT NULL AUTO_INCREMENT ,
`opskriftid` INT NOT NULL ,
`ingrediensid` INT NOT NULL ,
`maengde` INT NOT NULL ,
`enhed` VARCHAR( 10 ) NOT NULL ,
PRIMARY KEY ( `ID` )
);

Og det er tydeligvis forkert.........
Avatar billede kalp Novice
28. december 2006 - 14:45 #1
CREATE TABLE `maengde`(
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`opskriftid` INT NOT NULL ,
`ingrediensid` INT NOT NULL ,
`maengde` INT NOT NULL ,
`enhed` VARCHAR( 10 ) NOT NULL
);

burde virke.. og ellers prøv lige uden alle de der `, selv om det er mysql syntax
Avatar billede kviller Novice
28. december 2006 - 14:51 #2
Den jeg ville have var:

opskriftid (delt PK & FK) - INTEGER
ingrediensid (delt PK & FK) - INTEGER
maengde - INTEGER
enhed - VARCHAR(10)

Altså blive fri for den ID jeg selv havde lavet.

Den du skriver gør det samme som min egen :)
Avatar billede arne_v Ekspert
28. december 2006 - 15:02 #3
CREATE TABLE maengde (
  opskriftid INT NOT NULL ,
  ingrediensid INT NOT NULL ,
  maengde INT NOT NULL ,
  enhed VARCHAR( 10 ) NOT NULL ,
PRIMARY KEY ( opskriftid, ingrediensid )
);
Avatar billede arne_v Ekspert
28. december 2006 - 15:03 #4
du kan kun lave "rigtige" FK hvis du bruger InnoDB tabeller
Avatar billede kviller Novice
28. december 2006 - 15:06 #5
Det ved jeg så heller ikke hvad er? men arne kan du ikke lige smide et svar?
Avatar billede kalp Novice
28. december 2006 - 15:07 #6
CREATE TABLE `maengde` (`ID` INT NOT NULL AUTO_INCREMENT ,
`opskriftid` INT NOT NULL ,
`ingrediensid` INT NOT NULL ,
`maengde` INT NOT NULL ,
`enhed` VARCHAR( 10 ) NOT NULL ,
PRIMARY KEY ( `ID` ) ,
                      INDEX (ingrediens_navn, ingrediens_id),
                      FOREIGN KEY (ingrediens_navn, ingrediens_id)
                        REFERENCES ingrediens(navn, id)
                        ON UPDATE CASCADE ON DELETE RESTRICT,
                      INDEX (customer_id),
                      FOREIGN KEY (opskrift_id)
                        REFERENCES opskrift(id)) TYPE=INNODB;
Avatar billede kalp Novice
28. december 2006 - 15:08 #7
CREATE TABLE `maengde` (`ID` INT NOT NULL AUTO_INCREMENT ,
`opskriftid` INT NOT NULL ,
`ingrediensid` INT NOT NULL ,
`maengde` INT NOT NULL ,
`enhed` VARCHAR( 10 ) NOT NULL ,
PRIMARY KEY ( `ID` ) ,
                      INDEX (ingrediens_id),
                      FOREIGN KEY (ingrediens_id)
                        REFERENCES ingrediens(id)
                        ON UPDATE CASCADE ON DELETE RESTRICT,
                      INDEX (customer_id),
                      FOREIGN KEY (opskrift_id)
                        REFERENCES opskrift(id)) TYPE=INNODB;
Avatar billede kviller Novice
28. december 2006 - 15:25 #8
kalp:

Det lykkedes også med din version. (Efter at have ændret customer_id :)

Jeg opretter lige et nyt spørgsmål vedrørende referancer, det blev lidt mere indviklet end jeg lige havde regnet med. Smid lige et svar begge, da begge virker fint på hver sin måde.
Avatar billede arne_v Ekspert
28. december 2006 - 15:26 #9
MySQL tabeller kan vaere flere forskellige slags.

De to mest udbredte er MyISAM og InnoDB.

MyISAM er default, nem og hurtig.

InnoDB kan noget mere bl.a. transaktions support og support for foreign keys
(support = enforcer referentiel integritet og mulighed for cascade).

Du kan angive tabel type som:

CREATE TABLE ... (...) ENGINE=MYISAM;

og

CREATE TABLE ... (...) ENGINE=INNODB;

Syntax for foreign keys kan ses her:

http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

(eller i kalps eksempler ovenfor)

erfaringsmaessigt kan foreign keys i MySQL godt drille lidt, saa enten boer du vente
lidt med dem, eller saa skal du laese dokumentationen meget grundigt
Avatar billede kalp Novice
28. december 2006 - 15:26 #10
Det bare i orden..
Avatar billede arne_v Ekspert
28. december 2006 - 15:28 #11
og svar
Avatar billede kviller Novice
28. december 2006 - 15:31 #12
Takker mange gange begge 2. Altid rart med hjælp fra eksperter. Prøver at lave det uden brug af FK da jeg (som I sikkert har opdaget) ikke er ekspert på området (endnu).
Avatar billede kalp Novice
28. december 2006 - 15:34 #13
Jeg er ikke ekspert... endnu... men tak alligevel;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester