Столбец первичного ключа не допускает нулевые значения
У меня есть вопрос относительно первичного ключа или составного ключа. Я создал таблицу, в которой есть только два атрибута, и оба являются первичными ключами.
Имя первичных ключей item_ID̀ and
SName`
Эти два являются внешними ключами для другого первичного ключа (для двух других таблиц), где:item_ID --> ID
а также SName --> SkillName
ПУНКТ ИД SName 1 Основное оружие 2 3 4 Тяжелое оружие 5 экзотическое оружие 6 Тяжелое оружие 7 Силовое оружие
и результат таков:
Идентификаторы № 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');
Это правильно сделано? или есть другой способ кодировать, что идентификатор не требует определенного 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 ---> ID в таблице элементов и SName ---> SkillName в талантах. по какой-то причине я смог сделать внешний ключ из item_ID в ID, но не смог перевести из SName в SkillName:
значения, которые я добавил к этим таблицам, следующие: (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');
1 ответ
Вы пытаетесь справиться с ситуацией, когда Item
не имеет Requirement
, Другими словами, такой Item
не имеет никакого отношения к Talent
: просто не вставляйте ничего в Requirements
за это Item
!