2012-04-29 23 views
12
yol açar

Soru:

bir yabancı anahtar kısıtlaması ile bir tablo değiştirmeye çalışırken neden hata alıyorum?Değiştirme MySQL tablo hataları

Detayları:

Ben 1 tablo, tüm diğer spesifik tarih tabloları (. Yani USER_HISTORY, BROWSER_HISTORY, PICTURE_HISTORY ...) için bir temel tablo olarak kullanmak HSTORY var. Ayrıca, PICTURE ve USER tablolarını da aradıkları gibi ekledim.

TARİHİ tablosu:

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; 

KULLANIM tablosu: (herkes meraklı durumunda)

:

RESİM Tablo
CREATE TABLE IF NOT EXISTS USER 
(
    ID  INT NOT NULL AUTO_INCREMENT, 

    PRIMARY KEY (ID) 
) 
engine=innodb; 

(durumda herkes meraklı)

CREATE TABLE IF NOT EXISTS PICTURE ( ID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (ID) ) engine=innodb; 

PICTURE_HISTORY tablosu: Bu işi kabul

Key column 'FOREIGNID' doesn't exist in table 

Ben ilk FOREIGNID oluşturmak zorunda demek, ancak örneklerin birçoğunda:

CREATE TABLE IF NOT EXISTS PICTURE_HISTORY LIKE HISTORY; 

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

böyle yaptığımda, ben olsun SO üzerinde, yukarıda çalışmalıdır. Bunun neden oluştuğunu bilen var mı?

+1

Bir örnek nerede görmek istiyorum Bu işe yaramalı ... "FOREIGNID" zaten mevcut değilse işe yaramaz. Sadece onu kullanan bir kısıtlama oluşturarak bir sütun oluşturamazsınız. –

+0

@Michael iki farklı deyim ("FOREGINID" ve diğeri bir FOREIGN KEY 'oluşturmak için bir tane oluşturmak zorunda mıyım yoksa tek bir seferde yapabilir miyim? – puk

+0

Aslında emin değilim - Hiç denemedim Eğer tek bir deyim denerseniz şikayet edeceğini bilmiyorum: Sadece bir deneyin: "ALTER TABLE PICTURE_HISTORY EKLE DIŞI EKLE DEĞİL DIŞI EKRAN İLETİŞİM fk_pictureid YABANCI ANAHTAR (FOREIGNID) REFERANSLAR RESİM (ID);' –

cevap

23

Hatamın dışına çıktığım için Michael adresine teşekkür ederiz. Sütun zaten mevcut olmadığı sürece aslında yabancı bir anahtar yapamam. Bu iki konu komutları yerine ise yabancı anahtar kısıtlaması oluşturulur:

ALTER TABLE PICTURE_HISTORY 
ADD COLUMN FOREIGNID INT NOT NULL; 

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

Öyle gibi, bir virgül kullanarak mysql için komutlar birleştirebilirsiniz:

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

teknik bir cevap olmasa da benim orijinal soru, yine de için teşekkürler – puk

+0

alter tablo odaları sütun productid int null eklemek, yabancı anahtar (productid) referanslar stock (productid) silme çağırma üzerine ekleyin); Bu işe yaramadı. – VijayaRagavan