Avatar billede hunter1978 Nybegynder
08. september 2004 - 09:26 Der er 39 kommentarer og
1 løsning

Hjælp til foreign key Part 2

Havde igår denner tråd kørende
http://www.eksperten.dk/spm/537131
Her fil jeg hjælp til at komme vidre, men jeg har stadigvæk nogle tabeller jeg ikke kan lave…
Jeg vedlægger her samtlige tabeller fra min db, både dem som virker og dem som ikke virker.
CREATE TABLE ATTENDEE  ( 
Attendee_id    INT    UNSIGNED            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            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;


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),
INDEX 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;


CREATE TABLE VALIDATION ( 
SSN        TINYINT    UNSIGNED            NOT NULL,
Hash_password    TEXT                NOT NULL,
Random_number    INT
INDEX SSN_ix (SSN),               
PRIMARY KEY (SSN, Hash_password),
FOREGIN KEY (SSN) REFERENCES EMPLOYEE(SSN))
TYPE = INNODB;

CREATE TABLE PROJECT ( 
Project_id    INT    UNSIGNED            NOT NULL,
Project_name    VARCHAR(30),
Project_start    DATE,
Project_end    DATE,
Customer_id    INT    UNSIGNED            NOT NULL,
INDEX Customer_id_ix (Customer_id),
PRIMARY KEY (Project_id),
FOREIGN KEY (Customer_id) REFERENCES CUSTOMER(Customer_id))
TYPE = Innodb;





CREATE TABLE PROJECT_PART ( 
Project_part_id    INT    UNSIGNED            NOT NULL,
Project_assignment    VARCHAR(30),
Location        VARCHAR(30),
Start        DATE,
End        DATE,
Project_id     INT    UNSIGNED            NOT NULL,
Supervisor_id    INT    UNSIGNED            NOT NULL,
INDEX Project_id_ix (Project_id),
INDEX Supervisor_id_ix (Supervisor_id),
PRIMARY KEY (Project_part_id),
FOREIGN KEY (Project_id) REFERENCES Project(Project_id),
FOREIGN KEY (Supervisor_id) REFERENCES EMPLOYEE(Employee_id))
TYPE = Innodb;


CREATE TABLE WORKS_ON (
SSN        TINYINT    UNSIGNED              NOT NULL,
Project_part_id    INT        UNSIGNED        NOT NULL,
Start        TIME,
End        TIME,
Date        DATE,
PRIMARY KEY (SSN,Project_part_id),
FOREIGN KEY (SSN) REFERENCES EMPLOYEE(SSN),
FOREIGN KEY (Project_part_id) REFERENCES Project_part(Project_part_id))
TYPE = Innodb;



CREATE TABLE ASSETS_AND_LIABILITIES ( 
Audit_id    INT    UNSIGNED            NOT NULL,
Date        DATE,
Price        DOUBLE,
Due        DATE,
Is_paid_date    DATE,
PRIMARY KEY (Audit_id))
TYPE = Innodb;

CREATE TABLE BILL ( 
Bill_id        INT        UNSIGNED            NOT NULL,
Audit_id    INT        UNSIGNED            NOT NULL,
Project_id    INT        UNSIGNED            NOT NULL
INDEX Audit_id_ix (Audit_id),
INDEX Project_id_ix (Project_id),
PRIMARY KEY (Bill_id),
FOREIGN KEY (Audit_id) REFERENCES ASSETS_AND_LIABILITIES(Audit_id),
FOREIGN KEY (Project_id) REFERENCES Project(Project_id))
TYPE = Innodb;


CREATE TABLE PRODUCT_PURCHASE ( 
Invoice_id    INT        UNSIGNED            NOT NULL,
Quantity    INT        UNSIGNED
Product_name    VARCHAR(30),
Audit_id    INT        UNSIGNED            NOT NULL,
CVR         TINYINT        UNSIGNED        NOT NULL,
INDEX Audit_id_ix (Audit_id),
INDEX CVR_ix (CVR),
PRIMARY KEY (Bill_id),
FOREIGN KEY (Audit_id) REFERENCES ASSETS_AND_LIABILITIES(Audit_id),
FOREIGN KEY (CVR) REFERENCES WHOLESALE (CVR))
TYPE = Innodb;

Det er PROJECT_PART, WORKS_ON, VALIDATIN og PRODUCT_PURCHAES.
Så jeg håber på der er en venlige sjæle vil hjælpe mig med at komme vidre :)
Avatar billede hunter1978 Nybegynder
08. september 2004 - 09:27 #1
Altså det er de fire som jeg nævnte der ikke virker :)
Avatar billede erikjacobsen Ekspert
08. september 2004 - 09:31 #2
KAn du ikke selv rette simple syntaks fejl, som fx:

CREATE TABLE VALIDATION (
SSN        TINYINT    UNSIGNED            NOT NULL,
Hash_password    TEXT                NOT NULL,
Random_number    INT
INDEX SSN_ix (SSN),             
PRIMARY KEY (SSN, Hash_password),
FOREGIN KEY (SSN) REFERENCES EMPLOYEE(SSN))
TYPE = INNODB;

til

CREATE TABLE VALIDATION (
SSN        TINYINT    UNSIGNED            NOT NULL,
Hash_password    TEXT                NOT NULL,
Random_number    INT,
INDEX SSN_ix (SSN),             
PRIMARY KEY (SSN, Hash_password),
FOREGIN KEY (SSN) REFERENCES EMPLOYEE(SSN))
TYPE = INNODB;
Avatar billede hunter1978 Nybegynder
08. september 2004 - 09:35 #3
Jo, men det er en fejl jeg har lavet da jeg prøvede at få det til at stå nogenlunde pænt herinde....
Der er komma i den tabel som jeg prøver at oprette i mysql.
Avatar billede arne_v Ekspert
08. september 2004 - 09:39 #4
Hvilke fejl får du ?
Avatar billede erikjacobsen Ekspert
08. september 2004 - 09:44 #5
Og vil du så ikke vise os den kode, der giver dig fejl?
Avatar billede hunter1978 Nybegynder
08. september 2004 - 09:47 #6
Jo, har fundet fejlen ved validation....
Det var af datatypen text, men den skal åbenbart defineres....
Så lavede den om til en VARCHAR.
Køre lige de tre andre og smider fejlen herind.
Tak for det :)
Avatar billede hunter1978 Nybegynder
08. september 2004 - 09:48 #7
mysql> CREATE TABLE PROJECT_PART (
    -> Project_part_id  INT    UNSIGNED                NOT NULL,
    -> Project_assignment      VARCHAR(30),
    -> Location        VARCHAR(30),
    -> Start            DATE,
    -> End              DATE,
    -> Project_id              INT    UNSIGNED                NOT NULL,
    -> Supervisor_id    INT    UNSIGNED                NOT NULL,
    -> INDEX Project_id_ix (Project_id),
    -> INDEX Supervisor_id_ix (Supervisor_id),
    -> PRIMARY KEY (Project_part_id),
    -> FOREIGN KEY (Project_id) REFERENCES Project(Project_id),
    -> FOREIGN KEY (Supervisor_id) REFERENCES EMPLOYEE(Employee_id))
    -> TYPE = Innodb;
ERROR 1005: Can't create table '.\pms\project_part.frm' (errno: 150)
Avatar billede hunter1978 Nybegynder
08. september 2004 - 09:49 #8
Ved ikke om det er fordi at Supervisor_id hedder Employee_id i EMPLOYEE tabellen.
Avatar billede hunter1978 Nybegynder
08. september 2004 - 09:50 #9
For samme fejl i WORKS_ON
mysql> CREATE TABLE WORKS_ON (
    -> SSN              TINYINT UNSIGNED                NOT NULL,
    -> Project_part_id  INT            UNSIGNED                NOT NULL,
    -> Start            TIME,
    -> End              TIME,
    -> Date            DATE,
    -> PRIMARY KEY (SSN,Project_part_id),
    -> FOREIGN KEY (SSN) REFERENCES EMPLOYEE(SSN),
    -> FOREIGN KEY (Project_part_id) REFERENCES Project_part(Project_part_id))
    -> TYPE = Innodb;
ERROR 1005: Can't create table '.\pms\works_on.frm' (errno: 150)
Avatar billede arne_v Ekspert
08. september 2004 - 09:50 #10
Jeg mener ikke at du kan lave key/index på en text (den er for lang).
Avatar billede hunter1978 Nybegynder
08. september 2004 - 09:52 #11
Nej, det var også det der var fejlen...
De eneste der ikke virker nu er de to overstående...
For samme fejl på dem som igår, men syntes at jeg gør som Arne_v viste mig.
Avatar billede arne_v Ekspert
08. september 2004 - 09:53 #12
Jeg kan slet ikke se Employee_id i EMPLOYEE tabellen ??
Avatar billede arne_v Ekspert
08. september 2004 - 09:55 #13
Prøv evt. med INDEX selvom foreign key er en del af primary key
Avatar billede hunter1978 Nybegynder
08. september 2004 - 09:56 #14
Nej, det er også en fejl der skal selvfølgelig stå SSN...
mysql> CREATE TABLE PROJECT_PART (
    -> Project_part_id  INT    UNSIGNED                NOT NULL,
    -> Project_assignment      VARCHAR(30),
    -> Location        VARCHAR(30),
    -> Start            DATE,
    -> End              DATE,
    -> Project_id              INT    UNSIGNED                NOT NULL,
    -> Supervisor_id    INT    UNSIGNED                NOT NULL,
    -> INDEX Project_id_ix (Project_id),
    -> INDEX Supervisor_id_ix (Supervisor_id),
    -> PRIMARY KEY (Project_part_id),
    -> FOREIGN KEY (Project_id) REFERENCES Project(Project_id),
    -> FOREIGN KEY (Supervisor_id) REFERENCES EMPLOYEE(SSN))
    -> TYPE = Innodb;
ERROR 1005: Can't create table '.\pms\project_part.frm' (errno: 150)
Avatar billede hunter1978 Nybegynder
08. september 2004 - 09:59 #15
Men jeg bruger jo index på begge.
Gør jeg ikke? :o
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:00 #16
mysql> CREATE TABLE PROJECT_PART (
    -> Project_part_id  INT    UNSIGNED                NOT NULL,
    -> Project_assignment      VARCHAR(30),
    -> Location        VARCHAR(30),
    -> Start            DATE,
    -> End              DATE,
    -> Project_id              INT    UNSIGNED                NOT NULL,
    -> Supervisor_id    INT    UNSIGNED                NOT NULL,
    -> INDEX Project_id_ix (Project_id),
    -> INDEX Supervisor_id_ix (Supervisor_id),
    -> PRIMARY KEY (Project_part_id),
    -> FOREIGN KEY (Project_id) REFERENCES Project(Project_id),
    -> FOREIGN KEY (Supervisor_id) REFERENCES EMPLOYEE(SSN))
    -> TYPE = Innodb;
ERROR 1005: Can't create table '.\pms\project_part.frm' (errno: 150)
mysql> CREATE TABLE WORKS_ON (
    -> Project_part_id  INT            UNSIGNED                NOT NULL,
    -> Start            TIME,
    -> End              TIME,
    -> Date            DATE,
    -> SSN              TINYINT UNSIGNED                NOT NULL,
    -> PRIMARY KEY (SSN,Project_part_id),
    -> FOREIGN KEY (SSN) REFERENCES EMPLOYEE(SSN),
    -> FOREIGN KEY (Project_part_id) REFERENCES Project_part(Project_part_id))
    -> TYPE = Innodb;
ERROR 1005: Can't create table '.\pms\works_on.frm' (errno: 150)
mysql>
Avatar billede arne_v Ekspert
08. september 2004 - 10:01 #17
det var WORKS_ON SSN jeg tænkte på, men jeg tror heller ikke at det er det
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:02 #18
ahh du mener sådan her:
mysql> CREATE TABLE WORKS_ON (
    -> Project_part_id  INT            UNSIGNED                NOT NULL,
    -> Start            TIME,
    -> End              TIME,
    -> Date            DATE,
    -> SSN              TINYINT UNSIGNED                NOT NULL,
    -> PRIMARY KEY (SSN,Project_part_id),
    -> INDEX Project_part_id_ix (Project_part_id),
    -> INDEX SSN_ix (SSN),
    -> FOREIGN KEY (SSN) REFERENCES EMPLOYEE(SSN),
    -> FOREIGN KEY (Project_part_id) REFERENCES Project_part(Project_part_id))
    -> TYPE = Innodb;
ERROR 1005: Can't create table '.\pms\works_on.frm' (errno: 150)
Avatar billede erikjacobsen Ekspert
08. september 2004 - 10:02 #19
Er det på en unix/linux maskine skal du huske at tabeller er casesensitive. Derfor?
Avatar billede erikjacobsen Ekspert
08. september 2004 - 10:03 #20
...tabelnavne er casesensitive....
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:03 #21
Der i Windows XP
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:03 #22
Skulle stå "det er i windows XP" :)
Avatar billede arne_v Ekspert
08. september 2004 - 10:05 #23
supervisor_id er INT men SSN er tinyint !
Avatar billede arne_v Ekspert
08. september 2004 - 10:06 #24
-> Supervisor_id    INT    UNSIGNED                NOT NULL,

    -> FOREIGN KEY (Supervisor_id) REFERENCES EMPLOYEE(SSN))

SSN        TINYINT    UNSIGNED            NOT NULL,
Avatar billede arne_v Ekspert
08. september 2004 - 10:07 #25
PS: Jeg synes at du skulle lave SSN alias employee id til INT - du løber meget
hurtigt tør for for id's med TINYINY
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:09 #26
Ahh Tak :) Godt set..... :)
Men grunden til at det er en TINYINT er at den ikke kommer over **-**-**-**** 10 cifre, ihvertfald ikke i DK. Er det ikke fint?
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:10 #27
ahh fuck ved hvad du menner... Tænkte nmig vist ikke lige om der.
Avatar billede arne_v Ekspert
08. september 2004 - 10:10 #28
????

TINYINT tager værdier fra -128 til 127

TINYINT UNSIGNED fra 0 til 255

og max. 255 ansatte er ikke ret mange !
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:20 #29
Hej arne_V
Jeg Slettede databasen, og oprettede den igen, med de tilføjelser som du er kommet med. Nu kunne jeg godt oprette samtlige tabeller :)
Men er lidt i tvivl om WORKS_ON:
mysql> CREATE TABLE WORKS_ON (
    -> Project_part_id  INT            UNSIGNED                NOT NULL,
    -> Start            TIME,
    -> End              TIME,
    -> Date            DATE,
    -> SSN              INT    UNSIGNED                NOT NULL,
    -> PRIMARY KEY (Project_part_id,SSN),
    -> INDEX Project_part_id_ix (Project_part_id),
    -> INDEX SSN_ix (SSN),
    -> FOREIGN KEY (SSN) REFERENCES EMPLOYEE(SSN),
    -> FOREIGN KEY (Project_part_id) REFERENCES Project_part(Project_part_id))
    -> TYPE = Innodb;
Query OK, 0 rows affected (0.08 sec)

Er det nødvendigt at have index på begge to?
- Eller er det nok med SSN?
Du har ikke et link til et andet sted, end det du gave igår?
- Altså med INDEX :)
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:22 #30
Kunne godt nøjes med et INDEX med SSN...
- Men kan ikke se det logiske i det INDEX :(
mysql> CREATE TABLE WORKS_ON (
    -> Project_part_id  INT            UNSIGNED                NOT NULL,
    -> Start            TIME,
    -> End              TIME,
    -> Date            DATE,
    -> SSN              INT    UNSIGNED                NOT NULL,
    -> INDEX SSN_ix (SSN),
    -> PRIMARY KEY (Project_part_id,SSN),
    -> FOREIGN KEY (SSN) REFERENCES EMPLOYEE(SSN),
    -> FOREIGN KEY (Project_part_id) REFERENCES Project_part(Project_part_id))
    -> TYPE = Innodb;
Query OK, 0 rows affected (0.09 sec)
Avatar billede arne_v Ekspert
08. september 2004 - 10:23 #31
Jeg ved det ikke.

Prøv det ! (som det hedder i TV reklamerne)

Nej - jeg har ikke kunnet finde noget godt om INDEX inden i CREATE TABLE.
Avatar billede arne_v Ekspert
08. september 2004 - 10:24 #32
Du kan også prøve om du kan undvære index på SSN (da SSN indgår i primary key også)
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:24 #33
Det kan man ikke det er det jeg ikke forstår...
Syntes det der INDEX virker ulogisk :(
Avatar billede arne_v Ekspert
08. september 2004 - 10:25 #34
Problemet er nok lidt at når folk får behov for transaktioner og foreign keys, så
skifter folk tit fra MySQL til en anden (dyrere) database i stedetfor at skifte
til InnoDB tabeller.

Det påvirker naturligvis både dokumentation og den hjælp man
kan finde på nettet.
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:25 #35
Men du har tjent dine point!
Så kom med et svar :)
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:26 #36
Ved du om problemt med index/foreign keys er løst i v.5?
Avatar billede arne_v Ekspert
08. september 2004 - 10:34 #37
Som jeg kan læse i docs, så har de ændret det således at når felter anvendes
i foreign key bliver der automatisk lavet et index, hvis ikke det allerede
er det.

Lyder praktisk !
Avatar billede arne_v Ekspert
08. september 2004 - 10:34 #38
svar
Avatar billede hunter1978 Nybegynder
08. september 2004 - 10:36 #39
Tak for hjælpen!
Det er squ cool at der er folk som dig :)
Avatar billede arne_v Ekspert
19. september 2004 - 19:16 #40
Så mangler du bare lige at acceptere mit svar (marker mit navn så det bliver blåt
og klik accepter).
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