2012-04-29 20 views
12

Frage:

Warum bin ich Fehler bekommen, wenn eine Tabelle mit einem Fremdschlüssel zu ändern versuchen?Ändern von MySQL-Tabelle Fremdschlüssel hinzuzufügen führt zu Fehlern

Details:

Ich habe 1 Tisch, HSTORY, die ich als eine Basistabelle für alle anderen spezifischen Verlaufstabellen verwenden (dh USER_HISTORY, BROWSER_HISTORY, PICTURE_HISTORY ....). Ich habe auch die PICTURE und USER Tabellen enthalten, wie sie auch genannt werden.

Historientabelle:

CREATE TABLE IF NOT EXISTS HISTORY 
(
    ID  INT NOT NULL AUTO_INCREMENT, 
    VIEWERID INT NOT NULL , 
    VIEWDATE TIMESTAMP NOT NULL DEFAULT NOW(), 

    PRIMARY KEY (ID), 
    FOREIGN KEY (VIEWERID) REFERENCES USER(ID) 
) 
engine=innodb; 

USER Tabelle: (falls jemand ist gespannt)

CREATE TABLE IF NOT EXISTS USER 
(
    ID  INT NOT NULL AUTO_INCREMENT, 

    PRIMARY KEY (ID) 
) 
engine=innodb; 

PICTURE Tabelle: (falls jemand gespannt ist)

CREATE TABLE IF NOT EXISTS PICTURE 
(
    ID  INT NOT NULL AUTO_INCREMENT, 

    PRIMARY KEY (ID) 
) 
engine=innodb; 

PICTURE_HISTORY Tabelle:

CREATE TABLE IF NOT EXISTS PICTURE_HISTORY LIKE HISTORY; 

ALTER TABLE PICTURE_HISTORY 
ADD FOREIGN KEY (FOREIGNID) REFERENCES PICTURE(ID); 

Allerdings, wenn ich dies tun, erhalte ich:

Key column 'FOREIGNID' doesn't exist in table 

ich das so verstehen, dass ich zum ersten Mal FOREIGNID schaffen müssen, aber in vielen der Beispiele auf SO sollte das obige funktionieren. Wer weiß, warum das passiert?

+1

Ich möchte ein Beispiel sehen, wo das sollte funktionieren ... Es wird nicht funktionieren, es sei denn, FOREIGNID existiert bereits. Sie können eine Spalte nicht einfach erstellen, indem Sie eine Einschränkung erstellen, die sie verwendet. –

+0

@Michael müsste ich zwei alter-Anweisungen ausgeben (einen um 'FOREGINID' zu erstellen und einen anderen, um es zu einem FREMDSCHLÜSSEL zu machen? Oder kann ich es auf einmal machen? – puk

+0

Nicht wirklich sicher - Ich habe es noch nie probiert, also ich nicht weiß nicht, ob es sich beschweren wird, wenn Sie eine Aussage versuchen. Versuchen Sie es einfach: 'ALTER TABLE PICTURE_HISTORY FOREIGNID HINZUFÜGEN INT NOT NULL CONSTRAINT HINZUFÜGEN fk_pictureid FREE KEY (FOREIGNID) REFERENZEN BILD (ID);' –

Antwort

23

Dank Michael für den Hinweis auf meinen Fehler. Ich kann eigentlich keinen Fremdschlüssel erstellen, wenn die Spalte nicht bereits existiert. Wenn stattdessen ich diese beiden Befehle ausgeben, wird der Fremdschlüssel erstellt:

ALTER TABLE PICTURE_HISTORY 
ADD COLUMN FOREIGNID INT NOT NULL; 

ALTER TABLE PICTURE_HISTORY 
ADD FOREIGN KEY (FOREIGNID) REFERENCES PICTURE(ID); 
8

Sie können Befehle für mysql kombinieren, um ein Komma, etwa so:

ALTER TABLE PICTURE_HISTORY 
ADD COLUMN FOREIGNID INT NOT NULL, 
ADD FOREIGN KEY (FOREIGNID) REFERENCES PICTURE(ID); 
+0

obwohl technisch keine Antwort auf meine ursprüngliche Frage, danke für den Tipp nichtsdestotrotz – puk

+0

alter table rooms add Spalte productid int nicht null, add Fremdschlüssel (productid) Referenzen Lager (productid) auf delete cascade); das hat nicht funktioniert. – VijayaRagavan

Verwandte Themen