【问题标题】:Primary key column does not allow null values主键列不允许空值
【发布时间】:2013-12-29 09:54:50
【问题描述】:

我有一个关于主键或复合键的问题。我创建了一个表,其中只有两个属性,并且都是主键。

主键名是item_ID̀ andSName`

这两个是另一个主键(其他两个表)的外键,其中: item_ID --> IDSName --> SkillName

项目 ID 名称 1 基本武器 2 3 4 重型武器 5 种异国武器 6 重型武器 7 动力武器

结果是这样的:

ID nr 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 ---> 项目表中的 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');

【问题讨论】:

  • 每个表只能有一个主键。你是说你的PK是由item_IDsname组成的复合键?
  • 没错,或者就是这样。这里是代码: CREATE TABLE requierments (item_ID int(11) NOT NULL DEFAULT '0', SName varchar(30) NOT NULL DEFAULT '', PRIMARY KEY (item_ID,SName),约束requierments_ibfk_1外键(item_ID)参考itemID))引擎=InnoDB默认字符集=utf8;我也尝试为两个单独的表创建一个外键,但是当我尝试使用 SName 时,它​​给了我一个错误代码 1452
  • 那么你的模型中有三个表?请提供它们的简短描述。看起来 requirements.item_IDrequirements.SName 都是同一个 item 表的外键,但您的最后一条评论让我感到困惑(“外键 (...) 到两个单独的表”)。
  • @RandomSeed 我将在我的第一篇文章中发布 3 个表格。希望它会更清楚一点:)

标签: mysql null foreign-keys primary-key compound-key


【解决方案1】:

您正在尝试处理Item 没有Requirement 的情况。换句话说,这样的ItemTalent 没有没有关系:简单地不要在Requirements 中插入任何东西Item

【讨论】:

  • 附带问题:ItemTalent 之间的关系的本质是什么?如果Item 需要零或一 Talent(不再有),那么您的Requirements 表是多余的,项目的需求应该使用Item 中的简单外键建模(参考Talent)。除此之外,你的模型很好。
  • 目前只需要一个天赋,但很快就会添加一些,每个项目需要多个天赋,你说如果不需要任何要求,就不要插入任何东西,但是当我尝试这样做会发生错误。我已经修复了大部分错误。但卡在表人才列 Talent_requiert 我插入空值或''还是什么都不插入?表格要求也是如此,如果该特定项目不需要我添加''?因为我不允许在主键中添加 null?
  • 不要在requirements 中插入任何记录。 SELECT item.* FROM item LEFT JOIN requirements ON requirements.item_id = item.id WHERE item_id IS NULL 将列出没有要求的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2014-05-29
  • 2013-05-11
相关资源
最近更新 更多