2013-12-11 114 views
2

我有一個關於主鍵或複合鍵的問題。我創建了一個只有兩個屬性並且都是主鍵的表。主鍵列不允許空值

的主鍵的名稱是item_ID̀ and SName`

這兩個外鍵的另一個主鍵(對於其他兩個表),其中: item_ID --> IDSName --> SkillName

 
ITEM ID  SName 

1  Basic weapons 
2 
3 
4  Heavy weapon 
5  Exotic Weapons 
6  Heavy weapon 
7  Power weapon 

和結果是這樣的:

身份證號碼2和3不需要技能名稱要求。出於這個原因,我已經這樣實現(因爲主鍵不允許爲空):

INSERT INTO Requierments (item_ID, SName) VALUES ( 
01, 'Basic weapons'); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
02, null); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
03, null); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
04, 'Heavy weapon'); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
05, 'Exotic Weapons'); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
06, 'Heavy weapon'); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
07, 'Power weapon'); 

這是否正確完成?還是有另一種方式來編碼該ID不需要特定的SName?


這裏是在3代表的代碼:

CREATE TABLE `talents` (
    `SkillName` varchar(30) NOT NULL DEFAULT '', 
    `Bonus` varchar(30) DEFAULT NULL, 
    `Description` varchar(70) DEFAULT NULL, 
    `R_Str` int(11) DEFAULT NULL, 
    `R_WS` int(11) DEFAULT NULL, 
    `R_BS` int(11) DEFAULT NULL, 
    `R_Fel` int(11) DEFAULT NULL, 
    `R_Per` int(11) DEFAULT NULL, 
    `R_Int` int(11) DEFAULT NULL, 
    `R_Agi` int(11) DEFAULT NULL, 
    `R_WP` int(11) DEFAULT NULL, 
    `Talent_requiert` varchar(30) DEFAULT NULL, 
    PRIMARY KEY (`SkillName`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `requierments` (
    `item_ID` int(11) NOT NULL DEFAULT '0', 
    `SName` varchar(30) NOT NULL DEFAULT '', 
    PRIMARY KEY (`item_ID`,`SName`), 
    CONSTRAINT `requierments_ibfk_1` FOREIGN KEY (`item_ID`) REFERENCES `item` (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `item` (
    `ID` int(11) NOT NULL DEFAULT '0', 
    `Name_` varchar(30) DEFAULT NULL, 
    `Weight` int(11) DEFAULT NULL, 
    `Value_` int(11) DEFAULT NULL, 
    `Availability` varchar(30) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

的想法是在表中的要求ITEM_ID --->在項目表,並在人才SNAME ---> SkillName ID。出於某種原因,我能夠從item_ID到ID的外鍵,但不能從SName到技巧名稱:

我已經添加到這些表中的值如下(OBS,在表中我需要設置ID 2和3「」,因爲不需要任何天賦可以選擇它。但我不確定我是否允許使用該方法?

INSERT INTO Talents (SkillName, Bonus, Description, R_Str, R_WS, R_BS, R_Fel, R_Per, R_Int, R_Agi, R_WP, Talent_requiert) VALUES (
'ambidextrous', 0, 'use either hand equally well', 0, 0, 0, 0, 0, 0, 30, 0, null); 

INSERT INTO Talents (SkillName, Bonus, Description, R_Str, R_WS, R_BS, R_Fel, R_Per, R_Int, R_Agi, R_WP, Talent_requiert) VALUES (
'Frenzy', 0, 'enter psychotic rage to gain combat bonus', 0, 0, 0, 0, 0, 0, 0, 0, null); 

INSERT INTO Talents (SkillName, Bonus, Description, R_Str, R_WS, R_BS, R_Fel, R_Per, R_Int, R_Agi, R_WP, Talent_requiert) VALUES (
'battle rage', 0, 'parry while frenzied', 0, 0, 0, 0, 0, 0, 0, 0, 'Frenzy'); 

INSERT INTO Talents (SkillName, Bonus, Description, R_Str, R_WS, R_BS, R_Fel, R_Per, R_Int, R_Agi, R_WP, Talent_requiert) VALUES (
'Exotic Weapons', 0, 'Player is able to use exotic weapons', 0, 0, 0, 0, 0, 0, 0, 0, 'Basic weapons'); 

INSERT INTO Talents (SkillName, Bonus, Description, R_Str, R_WS, R_BS, R_Fel, R_Per, R_Int, R_Agi, R_WP, Talent_requiert) VALUES (
'Basic weapons', 0, 'Player is able to use Basic weapons', 0, 0, 0, 0, 0, 0, 0, 0, null); 

INSERT INTO Talents (SkillName, Bonus, Description, R_Str, R_WS, R_BS, R_Fel, R_Per, R_Int, R_Agi, R_WP, Talent_requiert) VALUES (
'Heavy weapon', 0, 'Player is able to use heavy weapons', 30, 0, 0, 0, 0, 0, 0, 0, null); 

INSERT INTO Talents (SkillName, Bonus, Description, R_Str, R_WS, R_BS, R_Fel, R_Per, R_Int, R_Agi, R_WP, Talent_requiert) VALUES (
'Power weapon', 0, 'Player is able to use power weapons ', 40, 30, 0, 0, 0, 0, 0, 0, null); 



INSERT INTO Item (ID, Name_, Weight, Value_, Availability) VALUES (
01, 'Las Carbine', 3, 75, 'Common'); 

INSERT INTO Item (ID, Name_, Weight, Value_, Availability) VALUES (
02, 'Laspistol', 1, 50, 'Common'); 

INSERT INTO Item (ID, Name_, Weight, Value_, Availability) VALUES (
03, 'Shotgun', 5, 60, 'average'); 

INSERT INTO Item (ID, Name_, Weight, Value_, Availability) VALUES (
04, 'Heavy Bolter', 40, 2000, 'Very Rare'); 

INSERT INTO Item (ID, Name_, Weight, Value_, Availability) VALUES (
05, 'Needle pistol', 2, 1250, 'Very Rare'); 

INSERT INTO Item (ID, Name_, Weight, Value_, Availability) VALUES (
06, 'Chainsword', 6, 275, 'Rare'); 

INSERT INTO Item (ID, Name_, Weight, Value_, Availability) VALUES (
07, 'Power Sword', 4, 2500, 'Very Rare'); 


INSERT INTO Requierments (item_ID, SName) VALUES ( 
01, 'Basic weapons'); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
02, ''); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
03, ''); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
04, 'Heavy weapon'); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
05, 'Exotic Weapons'); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
06, 'Heavy weapon'); 

INSERT INTO Requierments (item_ID, SName) VALUES ( 
07, 'Power weapon'); 
+0

每個表格只能有一個主鍵。你是說你的PK是一個複合鍵,它包含在'item_ID'和'sname'中? –

+0

那是正確的,或者說這個想法。這裏是代碼:CREATE TABLE'requierments'( 'item_ID' int(11)NOT NULL DEFAULT'0', 'SName' varchar(30)NOT NULL DEFAULT'', PRIMARY KEY('item_ID','SName '), CONSTRAINT'requierments_ibfk_1' FOREIGN KEY('item_ID')REFERENCES'item'('ID') )ENGINE = InnoDB DEFAULT CHARSET = utf8; 我也試圖做一個forign鍵爲他們兩個分開的表,但有些原因,當我嘗試在SName它給了我一個錯誤代碼1452 – Santelices

+0

因此,有三個表在你的模型?請提供他們的簡短說明。它看起來像'requirements.item_ID'和'requirements.SName'是同一'item'表的外鍵,但是你最後的評論讓我困惑(「外鍵(...)到兩個分離的表」)。 – RandomSeed

回答

0

您正在嘗試處理情況的Item有沒有Requirement換句話說,這樣一個Item沒有關係有一個Talent:根本不要在中插入任何東西爲此Item

+0

側面問題:「物品」和「天賦」之間關係的性質是什麼?如果一個'Item'需要**零個或一個**'Talent'(不再有),那麼你的'Requirements'表是多餘的,一個Item的Requirement應該用'Item'中的一個簡單的外鍵建模(參考' Talent')。除此之外,你的模型很好。 – RandomSeed

+0

因爲它只有一個天賦是必需的,但是會增加一些,每個項目有不止一個天賦要求,你說如果不需要任何要求,就不要插入任何東西,但是當我嘗試這樣做時會發生錯誤。我已經修復了大部分錯誤。但卡在表talent天才talent_requiert我插入空值或''或沒有?如果沒有特定項目的需求,我會添加''嗎?因爲我不允許在主鍵中添加空值? – Santelices

+0

請勿在'requirements'中插入任何記錄。 'SELECT item。* FROM item LEFT JOIN require requirements.item_id = item.id WHERE item_id IS NULL'將列出沒有要求的項目。 – RandomSeed