2013-04-08 7 views
5

Próbuję utworzyć bazę danych z wielu kluczy obcych z ograniczeniami/update Usuń, ale mam kod błędu 1005 z następujących skryptów SQL:Mysql utworzyć tabelę ze stwardnieniem klucza obcego Delete SET NULL

CREATE TABLE Worker (
WorkerID smallint auto_increment, 
WorkerType varchar(45) NOT NULL, 
WorkerName varchar(45) NOT NULL, 
Position varchar(45) NOT NULL, 
TaxFileNumber int NOT NULL, 
Address varchar(100) , 
Phone  varchar(20) , 
SupervisorID smallint , 
PRIMARY KEY (WorkerID), 
FOREIGN KEY (SupervisorID) REFERENCES Worker(WorkerID) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE 
)Engine=InnoDB; 

CREATE TABLE Grape (
    GrapeID smallint NOT NULL, 
    GrapeType varchar(45) NOT NULL, 
    JuiceConversionRatio int, 
    StorageContainer ENUM('Stainless Steel Tank','Oak Barrel'), 
    AgingRequirement int, 
    PRIMARY KEY (GrapeID) 
)Engine=InnoDB; 

CREATE TABLE Vineyard (
    VineyardID smallint auto_increment, 
    VineyardName VARCHAR(45) NOT NULL, 
    FarmerID smallint NOT NULL, 
    GrapeID smallint NOT NULL, 
    ComeFrom varchar(45) NOT NULL, 
    HarvestedAmount int, 
    RipenessPercent int, 
    PRIMARY KEY (VineyardID), 
    FOREIGN KEY (FarmerID) REFERENCES Worker(WorkerID) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE, 
    FOREIGN KEY (GrapeID) REFERENCES Grape(GrapeID) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE 
)Engine=InnoDB; 

Kod błędu mówi, że nie udało się utworzyć tabeli Vineyard, po prostu chcę znać odpowiedni format do tworzenia wielu kluczy obcych z kontrolą usuwania/aktualizacji.

Odpowiedz

13

Twoja reguła klucza obcego to ON DELETE SET NULL, ale twoja definicja kolumny to NOT NULL.

Zmień definicję kolumny i usuń część NOT NULL lub przepadnij za regułę klucza obcego. Że działa:

CREATE TABLE Vineyard (
    VineyardID smallint auto_increment, 
    VineyardName VARCHAR(45) NOT NULL, 
    FarmerID smallint, 
    GrapeID smallint, 
    ComeFrom varchar(45) NOT NULL, 
    HarvestedAmount int, 
    RipenessPercent int, 
    PRIMARY KEY (VineyardID), 
    FOREIGN KEY (FarmerID) REFERENCES Worker(WorkerID) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE, 
    FOREIGN KEY (GrapeID) REFERENCES Grape(GrapeID) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE 
)Engine=InnoDB; 

SQLFiddle demo

-1

wizyta:

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

CREATE TABLE `ffxi_characterJob` (
`serverID` int(11) NOT NULL, 
`userid` int(10)unsigned NOT NULL, 
`characterName` varchar(255) NOT NULL, 
`jobAbbr` char(4) NOT NULL, 
`jobLevel` int(11) default '0', 
PRIMARY KEY (`serverID`,`userid`,`characterName`,`jobAbbr`), 
INDEX (`jobAbbr`), 
CONSTRAINT FOREIGN KEY (`serverID`,`userid`,`characterName`) REFERENCES `ffxi_characters` (`serverID`,`userid`,`characterName`) 
ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT FOREIGN KEY (`jobAbbr`) REFERENCES `ffxi_jobType` (`jobAbbr`) ON DELETE CASCADE ON UPDATE CASCADE 
) TYPE=InnoDB; 
0

Spróbuj z tworzenia tabeli (innoDB enginer) bez klucza obcego i użyć składni update table with constraint, dla przykład:

ALTER TABLE `vineyard` 
     ADD CONSTRAINT `relation_farmer_has_many_vineyards` 
      FOREIGN KEY (`farmer_id`) 
      REFERENCES `worker` (`worker_id`) 
      ON DELETE SET NULL 
      ON UPDATE CASCADE; 

referencyjny:

trick: nie zaleca się stosowania dużych liter (lub przypadek camel) w nazwach tabel zachowanie różni się od systemu operacyjnego g używany:

Powiązane problemy