2013-04-08 49 views
5

我想創建與刪除/更新約束的多個外鍵數據庫多個外鍵,但我得到一個錯誤代碼1005的以下SQL腳本:mysql的創建表上刪除集空

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; 

錯誤代碼表示無法創建Vineyard表,我只想知道用刪除/更新控件創建多個外鍵的正確格式。

回答

13

您的外鍵規則是ON DELETE SET NULL,但您的列定義是NOT NULL

要麼更改您的列定義,並刪除NOT NULL部分或者過度使用您的外鍵規則。這一工程:

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

訪問:

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

嘗試用無外鍵創建表(innoDB enginer),並使用update table with constraint語法,用於例如:

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; 

參考:

絕招:不建議在表的名稱中使用大寫字母(或駱駝)該行爲與操作系統不同克用於: