Avatar billede hunter1978 Nybegynder
07. september 2004 - 13:55 Der er 26 kommentarer og
1 løsning

Hjælp til foreign key

Hej
Hvorfor kan jeg ikke oprette min Wholesale tabel?

CREATE TABLE ATTENDEE  ( 
Attendee_id        INT    UNSIGNED    AUTO_INCREMENT        NOT NULL,
Phone        TINYINT    UNSIGNED,               
Street        VARCHAR(30),
Street_no        TINYINT    UNSIGNED,
Apt_no         VARCHAR(10),
City        VARCHAR(30),
Zip        TINYINT    UNSIGNED,   
Country        VARCHAR(30),
PRIMARY KEY (Attendee_id))
TYPE = Innodb;


CREATE TABLE WHOLESALE ( 
CVR        TINYINT    UNSIGNED            NOT NULL,
Attendee_id        INT                NOT NULL,
Wholesale_name    VARCHAR(30),
Description        VARCHAR
PRIMARY KEY (CVR)
FOREIGN KEY (Attendee_id) REFERENCES ATTENDEE(Attendee_id))
TYPE = Innodb;

Jeg bruger den seneste mysql, og har lavet en simpel test med en parent og child hvor det virker...
Har rodet med det hele dagen :(
Avatar billede hunter1978 Nybegynder
07. september 2004 - 13:56 #1
Ups min tabeler ser således ud:
CREATE TABLE WHOLESALE ( 
CVR        TINYINT    UNSIGNED            NOT NULL,
Attendee_id        INT                NOT NULL,
Wholesale_name    VARCHAR(30),
Description        VARCHAR,
PRIMARY KEY (CVR),
FOREIGN KEY (Attendee_id) REFERENCES ATTENDEE(Attendee_id))
TYPE = Innodb;
Avatar billede arne_v Ekspert
07. september 2004 - 14:02 #2
gæt: den er INT mens den er UNSIGNED INT i parent
Avatar billede arne_v Ekspert
07. september 2004 - 14:02 #3
altså Attendee_id
Avatar billede arne_v Ekspert
07. september 2004 - 14:07 #4
Der er heller ikke nogen længde på description VARCHAR'en
Avatar billede arne_v Ekspert
07. september 2004 - 14:07 #5
og et komma mangler der vist også
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:08 #6
Øh, det havde jeg ikke lige set....
Men den er rettet nu!
Men problemmet er stadigvæk der :(
Min tabeller:
CREATE TABLE ATTENDEE  ( 
Attendee_id        INT    UNSIGNED    AUTO_INCREMENT        NOT NULL,
Phone        TINYINT    UNSIGNED,               
Street        VARCHAR(30),
Street_no        TINYINT    UNSIGNED,
Apt_no         VARCHAR(10),
City        VARCHAR(30),
Zip        TINYINT    UNSIGNED,   
Country        VARCHAR(30),
PRIMARY KEY (Attendee_id))
TYPE = Innodb;


CREATE TABLE WHOLESALE ( 
CVR        TINYINT    UNSIGNED            NOT NULL,
Attendee_id        INT UNSIGNED            NOT NULL,
Wholesale_name    VARCHAR(30),
Description        VARCHAR,
PRIMARY KEY (CVR),
FOREIGN KEY (Attendee_id) REFERENCES ATTENDEE(Attendee_id))
TYPE = Innodb;
Avatar billede arne_v Ekspert
07. september 2004 - 14:08 #7
CREATE TABLE WHOLESALE ( 
CVR        TINYINT    UNSIGNED            NOT NULL,
Attendee_id        INT    UNSIGNED          NOT NULL,
Wholesale_name    VARCHAR(30),
Description        VARCHAR(200),
PRIMARY KEY (CVR)
FOREIGN KEY (Attendee_id) REFERENCES ATTENDEE(Attendee_id))
TYPE = Innodb;
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:08 #8
Hvor mangler der et komma?
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:09 #9
Skal datatyper defineres?
Description        VARCHAR(200),
Avatar billede arne_v Ekspert
07. september 2004 - 14:11 #10
En VARCHAR skal have en længde.

Det er muligt at der er en default (måske 255), men jeg angiver altid
eksplicit.
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:11 #11
Når jeg skriver dit eksempel, får jeg en ny fejl....
mysql> CREATE TABLE WHOLESALE (
    -> CVR              TINYINT    UNSIGNED                    NOT NULL,
    -> Attendee_id              INT UNSIGNED                    NOT NULL,
    -> Wholesale_name  VARCHAR(30),
    -> Description              VARCHAR(200),
    -> PRIMARY KEY (CVR),
    -> FOREIGN KEY (Attendee_id) REFERENCES ATTENDEE(Attendee_id))
    -> TYPE = Innodb;
ERROR 1005: Can't create table '.\pms\wholesale.frm' (errno: 150)
mysql>
Avatar billede arne_v Ekspert
07. september 2004 - 14:13 #12
Så er den kommer lidt videre.

Ligger der en fil i forvejen ? Er disken fuld ? Er der adgang til dir ?
Avatar billede arne_v Ekspert
07. september 2004 - 14:14 #13
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:16 #14
Den eneste fil der ligger i pms mappen er attendee.frm
Disken er ikke fuld, og der er adgang....
Kan ihvertfald drop og create attendee tabellen.
Avatar billede arne_v Ekspert
07. september 2004 - 14:16 #15
Det lyder som om at der skal laves et index på WHOLESALE Attendee_id
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:18 #16
Ok, hvordan gøres det?
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:21 #17
Har lavet dette her eksempel:
CREATE TABLE parent
(
  par_id  INT NOT NULL,
  PRIMARY KEY (par_id)
) TYPE = INNODB;
CREATE TABLE child
(
  par_id  INT NOT NULL,
  child_id  INT NOT NULL,
  PRIMARY KEY (par_id, child_id),
  FOREIGN KEY (par_id) REFERENCES parent (par_id)
) TYPE = INNODB;

Det virker......
Avatar billede arne_v Ekspert
07. september 2004 - 14:23 #18
CREATE TABLE WHOLESALE ( 
CVR        TINYINT    UNSIGNED            NOT NULL,
Attendee_id        INT    UNSIGNED          NOT NULL,
Wholesale_name    VARCHAR(30),
Description        VARCHAR(200),
INDEX Attendee_id_ix (Attendee_id),
PRIMARY KEY (CVR),
FOREIGN KEY (Attendee_id) REFERENCES ATTENDEE(Attendee_id))
TYPE = Innodb;
Avatar billede arne_v Ekspert
07. september 2004 - 14:24 #19
I det eksempel indgår child_id i PRIMARY KEY og så er det nok indekseret !
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:25 #20
Ok, det virker :)
Kan du kort forklare INDEX Attendee_id_ix (Attendee_id),
Er nemlig ny til MySQL
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:26 #21
Eller evt. et link hvor jeg kan læse om det :)
Avatar billede arne_v Ekspert
07. september 2004 - 14:30 #22
Der står lidt her:

http://dev.mysql.com/doc/mysql/en/CREATE_TABLE.html

(men liget netop det aspekt er ikke omtalt meget)
Avatar billede arne_v Ekspert
07. september 2004 - 14:32 #23
Den svarer til en:
  CREATE INDEX Attendee_id_ix ON WHOLESALE(Attendee_id)

Men da vi ikke kan oprette tabellen uden index så skal det med i CREATE TABLE.
Avatar billede arne_v Ekspert
07. september 2004 - 14:33 #24
I nyere MySQL versioner skulel det blive  oprettet automatisk, når man
laver FOREIGN KEY (jeg tror at de har fået mange klager !).
Avatar billede arne_v Ekspert
07. september 2004 - 14:33 #25
og et svar
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:44 #26
Ja, men så siger jeg tak for hjælpen, og du har selvfølgelig tjent dine points :)
Men forstår ikke helt det der index....
Har fået oprettet følgende tabeller:
CREATE TABLE ATTENDEE  ( 
Attendee_id        INT    UNSIGNED    AUTO_INCREMENT        NOT NULL,
Phone        TINYINT    UNSIGNED,               
Street        VARCHAR(30),
Street_no        TINYINT    UNSIGNED,
Apt_no         VARCHAR(10),
City        VARCHAR(30),
Zip        TINYINT    UNSIGNED,   
Country        VARCHAR(30),
PRIMARY KEY (Attendee_id))
TYPE = Innodb;


CREATE TABLE WHOLESALE ( 
CVR        TINYINT    UNSIGNED            NOT NULL,
Attendee_id        INT    UNSIGNED            NOT NULL,
Wholesale_name    VARCHAR(30),
Description        VARCHAR(200),
INDEX Attendee_id_ix (Attendee_id),
PRIMARY KEY (CVR),
FOREIGN KEY (Attendee_id) REFERENCES ATTENDEE(Attendee_id))
TYPE = Innodb;

CREATE TABLE CUSTOMER ( 
Customer_id        INT    UNSIGNED    AUTO_INCREMENT        NOT NULL,
Contact_person    VARCHAR(30),
Attendee_id        INT    UNSIGNED            NOT NULL,
INDEX Attendee_id_ix (Attendee_id),
PRIMARY KEY (Customer_id),
FOREIGN KEY (Attendee_id) REFERENCES ATTENDEE(Attendee_id))
TYPE = Innodb;


CREATE TABLE EMPLOYEE_TYPE ( 
Type_id        TINYINT    UNSIGNED            NOT NULL,
Type        VARCHAR(30),
PRIMARY KEY (Type_id))
TYPE = Innodb;

Når jeg nu laver min næste tabel som hedder EMPLOYEE får jeg fejl igen :(

CREATE TABLE EMPLOYEE ( 
SSN         TINYINT    UNSIGNED            NOT NULL,
First_name        VARCHAR(30),
Middel_name    VARCHAR(30),
Last_name        VARCHAR(30),   
Sex        CHAR,
Field_of_work    VARCHAR(30),
Start_date        DATE,
Time_rate        DOUBLE    UNSIGNED,
Email        VARCHAR(30),
Type_id              TINYINT    UNSIGNED            NOT NULL,
Attendee_id        INT    UNSIGNED                NOT NULL,
INDEX Type_id_ix (Type_id),
NDEX Attendee_id_ix (Attendee_id),
PRIMARY KEY (SSN),
FOREIGN KEY (Type_id) REFERENCES EMPLOYEE_TYPE(Type_id),
FOREIGN KEY (Attendee_id) REFERENCES ATTENDEE(Attendee_id))
TYPE = Innodb;
Avatar billede hunter1978 Nybegynder
07. september 2004 - 14:47 #27
Damm det var min copy paste der mangelede et I foran NDEX....
Nå, men så siger jeg tak for hjælpen :)
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