Avatar billede henrywood Nybegynder
23. oktober 2002 - 17:30 Der er 7 kommentarer

Foreign key problem i MySQL Max 4

Jeg har følgende SQL-skema, men får dog en error 1005 + errno 150 ved oprettelse af tabellen Maskine og jeg kan ikke se, hvad der er galt

100 stærke til den hurtigste !

CREATE TABLE KontaktPerson (
    KPID SMALLINT DEFAULT 0 AUTO_INCREMENT NOT NULL,   
    ForNavn VARCHAR ( 50 ) NOT NULL,
    EfterNavn VARCHAR ( 50 ) NOT NULL,
    Adresse VARCHAR ( 80 ) NOT NULL,
    PostNr INTEGER NOT NULL,
    City VARCHAR ( 50 ) NOT NULL,
    TelefonNr INTEGER NOT NULL,
    MobilNr INTEGER,
    Email VARCHAR ( 60 ) not null,
    FaxNr INTEGER,
    PRIMARY KEY    (KPID),
    INDEX IDX_KontaktPerson_KPID (KPID),
    INDEX IDX_KontaktPerson_ForEfter (ForNavn, EfterNavn),
    INDEX IDX_KontaktPerson_EfterFor (EfterNavn, ForNavn)   
    ) TYPE = InnoDB;

CREATE TABLE FirmaData (
    FID SMALLINT DEFAULT 0 AUTO_INCREMENT NOT NULL,
    KPID SMALLINT NOT NULL,
    FirmaNavn VARCHAR ( 50 ) NOT NULL,
    Adresse VARCHAR ( 80 ) NOT NULL,
    PostNr INTEGER NOT NULL,
    City VARCHAR ( 50 ) NOT NULL,
    TelefonNr INTEGER NOT NULL,
    FaxNr INTEGER,
    PostBox INTEGER,
    Email VARCHAR ( 60 ) NOT NULL,
    WebAdresse VARCHAR ( 100 ),
    SENr INTEGER,
    KvalitetsCertificering VARCHAR ( 100 ),
    BrugerNavn VARCHAR ( 50 ) NOT NULL,
    Password VARCHAR ( 50 ) NOT NULL,   
    PRIMARY KEY (FID),
    FOREIGN KEY (KPID) REFERENCES KontaktPerson (KPID),
    INDEX IDX_FirmaData_FID (FID),
  INDEX IDX_FirmaData_KPID (KPID),
  INDEX IDX_FirmaData_FID_KPID (FID, KPID),
  INDEX IDX_FirmaData_FirmaNavn (FirmaNavn(10)),
  INDEX IDX_FirmaData_Adresse (Adresse(10)),
  INDEX IDX_FirmaData_TelefonNr (TelefonNr)
    ) TYPE = InnoDB;

CREATE TABLE HovedKategori (
    HKID SMALLINT DEFAULT 0 AUTO_INCREMENT NOT NULL,
    Navn VARCHAR ( 50 ) NOT NULL,
    PRIMARY KEY (HKID),
  INDEX IDX_HovedKategori_HKID (HKID),
    INDEX IDX_HovedKategori_Navn (Navn)
    ) TYPE = InnoDB;
           
CREATE TABLE UnderKategori (
    UKID SMALLINT DEFAULT 0 AUTO_INCREMENT NOT NULL,
    HKID SMALLINT NOT NULL ,
    Navn VARCHAR ( 50 ) NOT NULL,
    PRIMARY KEY (UKID),
    FOREIGN KEY (HKID) REFERENCES HovedKategori (HKID),
    INDEX IDX_UnderKategori_HKID_UKID (HKID, UKID),
    INDEX IDX_UnderKategori_Navn (Navn)
    ) TYPE = InnoDB;

CREATE TABLE HovedGruppe (
    HGID SMALLINT DEFAULT 0 AUTO_INCREMENT NOT NULL,
    Navn VARCHAR ( 50 ) NOT NULL,
    PRIMARY KEY (HGID),
    INDEX IDX_HovedGruppe_HGID (HGID),
    INDEX IDX_HovedGruppe_Navn (Navn)
    ) TYPE = InnoDB;   
   
CREATE TABLE UnderGruppe (
    UGID SMALLINT DEFAULT 0 AUTO_INCREMENT NOT NULL,
    HGID SMALLINT NOT NULL,
    Navn VARCHAR ( 50 ) NOT NULL,
    PRIMARY KEY (UGID),
    FOREIGN KEY (HGID) REFERENCES HovedGruppe (HGID),
    INDEX IDX_UnderGruppe_HGID_UGID (HGID, UGID),
    INDEX IDX_UnderGruppe_Navn (Navn)
    ) TYPE = InnoDB;       
       
CREATE TABLE MaskinSpecifikation (
    MSID SMALLINT DEFAULT 0 AUTO_INCREMENT NOT NULL,
    UGID SMALLINT NOT NULL,
    Navn VARCHAR ( 100 ) NOT NULL,
    MaaleEnhed VARCHAR ( 16 ) NOT NULL,
    IntervalMin INTEGER,
    IntervalMax INTEGER,
    PRIMARY KEY (MSID),
    FOREIGN KEY (UGID) REFERENCES UnderGruppe (UGID),
    INDEX IDX_MaskinSecifikation_Navn (Navn),
    INDEX IDX_MaskinSecifikation_Navn_UGID (Navn, UGID),
    INDEX IDX_MaskinSecifikation_Min_Max (IntervalMin, IntervalMax),
    INDEX IDX_MaskinSecifikation_Max_Min (IntervalMax, IntervalMin)
    ) TYPE = InnoDB;   

CREATE TABLE MS_MA_Link (
    MSID SMALLINT NOT NULL,
    MAID SMALLINT NOT NULL,
    PRIMARY KEY (MSID, MAID),
    FOREIGN KEY (MSID) REFERENCES MaskinSpecifikation (MSID),
    FOREIGN KEY (MAID) REFERENCES Maskine (MAID),
    INDEX IDX_MS_MA_Link_MSID_MAID (MSID, MAID),
    INDEX IDX_MS_MA_Link_MAID_MSID (MAID, MSID)
    ) TYPE = InnoDB;

CREATE TABLE SpecifikationsData (
    SDID SMALLINT DEFAULT 0 AUTO_INCREMENT NOT NULL,
    MSID SMALLINT NOT NULL,
    MAID SMALLINT NOT NULL,
    SpecifikationsVaerdi VARCHAR ( 200 ) NOT NULL,
    PRIMARY KEY (SDID),
    FOREIGN KEY (MSID) REFERENCES MaskinSpecifikation (MSID),
    FOREIGN KEY (MAID) REFERENCES Maskine (MAID),
    INDEX IDX_SecifikationsData_SDID (SDID),
    INDEX IDX_SecifikationsData_MSID_MAID (MSID, MAID),
    INDEX IDX_SecifikationsData_MAID_MSID (MAID, MSID)
    ) TYPE = InnoDB;           

CREATE TABLE HK_FD_Link (   
    FID SMALLINT NOT NULL,
    HKID SMALLINT NOT NULL,
    PRIMARY KEY (FID, HKID),
    FOREIGN KEY (FID) REFERENCES FirmaData (FID),
    FOREIGN KEY (HKID) REFERENCES HovedKategori (HKID),
    INDEX IDX_HK_FD_Link_FID_HKID (FID, HKID),
    INDEX IDX_HK_FD_Link_HKID_FID (HKID, FID)
    ) TYPE = InnoDB;
   
CREATE TABLE UK_FD_Link (
    FID SMALLINT NOT NULL,
    UKID SMALLINT NOT NULL,
    PRIMARY KEY (FID, UKID),
    FOREIGN KEY (FID) REFERENCES FirmaData (FID),
    FOREIGN KEY (UKID) REFERENCES UnderKategori (UKID),
    INDEX IDX_UK_FD_Link_FID_UKID (FID, UKID),
    INDEX IDX_UK_FD_Link_UKID_FID (UKID, FID)
    ) TYPE = InnoDB;

CREATE TABLE SoegeOrd (
    SOID SMALLINT DEFAULT 0 AUTO_INCREMENT NOT NULL,
    FID SMALLINT NOT NULL,
    SoegeNavn VARCHAR ( 100 ),
    PRIMARY KEY (SOID),
    FOREIGN KEY (FID)  REFERENCES FirmaData (FID),
    INDEX IDX_SoegeOrd_FID_SOID (FID, SOID),
    INDEX IDX_SoegeOrd_SOID_FID (SOID, FID),
    INDEX IDX_SoegeOrd_SoegeNavn (SoegeNavn)   
    ) TYPE = InnoDB;   

CREATE TABLE Maskine (
    MAID SMALLINT DEFAULT 0 AUTO_INCREMENT NOT NULL,
    FID SMALLINT NOT NULL,
    KPID SMALLINT NOT NULL,
    UGID SMALLINT NOT NULL,
  PRIMARY KEY (MAID),
  FOREIGN KEY (FID) REFERENCES FirmaData (FID),
  FOREIGN KEY (KPID) REFERENCES KontaktPerson (KPID),
    FOREIGN KEY (UGID) REFERENCES UnderGruppe (UGID),
  INDEX IDX_Maskine_FID_KPID_UGID (FID, KPID, UGID),
    INDEX IDX_Maskine_UGID_FID_KPID (UGID, FID, KPID)   
    ) TYPE = InnoDB;
Avatar billede disky Nybegynder
23. oktober 2002 - 17:38 #1
Kun beta udgaven, som ikke er stabil understøtter foreign keys.

SÅ fjern dem og prøv igen.
Avatar billede henrywood Nybegynder
23. oktober 2002 - 17:47 #2
Jeg kører 4.0.2 Max alpha. Men jeg forstår ikke at de første tabeller med fremmednøgler jo oprettes OK ???? Jeg kan ikke se nogen særlig forskel på disse i forhold til Maskine-tabellen ??

Skal jeg forstå dig sådan at Betaudgaven heller ikke understøtter foreign keys ordentligt ?
Avatar billede disky Nybegynder
23. oktober 2002 - 17:50 #3
hmmm mystisk.

Har du prøvet at slå de foreign keys i Maskine til en efter en for at se hvilken der laver balladen.

Ellers vil jeg give dig ret i at det ser lidt mystisk ud.

Jeg har dårlig erfaring med alpha/beta af mysql derfor ville jeg personligt ikke anvende dem. Specielt ikke hvis data bare er lidt vigtigt.
Avatar billede henrywood Nybegynder
23. oktober 2002 - 17:55 #4
Nej, har ikke prøvet at slå dem fra, men prøver lige ...
Avatar billede henrywood Nybegynder
23. oktober 2002 - 18:00 #5
Hvad mener du iøvrigt med dårlige erfaringer mere specifikt ?
Avatar billede henrywood Nybegynder
23. oktober 2002 - 18:05 #6
Problemet er tilsyneladende den CONSTRAINT der ser sådan ud:

FOREIGN KEY (KPID) REFERENCES KontaktPerson (KPID),

men kan rækkefølge de constraints erklæres i spille nogle rolle, specielt da jeg senere vil lave CASCADE constraints ?

For stor er iøvrigt en SMALLINT ?
Avatar billede disky Nybegynder
23. oktober 2002 - 18:13 #7
Problemmerne var ustabilitet, tab af data, forker udførte queries osv.

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
A small integer. The signed range is -32768 to 32767. The unsigned range is 0 to 65535.

Se på
http://www.mysql.com/doc/en/Column_types.html

Om rækkefølgen betyder noget tør jeg ikke svare på, men jeg tror næsten det stør i release notes til Mysql 4.0
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