【问题标题】:mysql foreign key does not check for correct valuesmysql外键不检查正确的值
【发布时间】:2014-05-26 13:21:00
【问题描述】:

我有 3 张桌子:

CREATE TABLE World_Type ( 
  Name_             varchar (15) NOT NULL,
  Skills            varchar (30),
  Bonus             varchar (30),       
  Penalty           varchar (30),
  Description       varchar (90),
  PRIMARY KEY (Name_)   );

  CREATE TABLE Class (
  Class_name        varchar (30) NOT NULL,
  Description       varchar (50),
  PRIMARY KEY (Class_name)  );

CREATE TABLE character_ ( 
  Name_             varchar (30) NOT NULL,
  Class             varchar (30),
  World_Type        varchar (15),
  Str               integer     ,
  WS                integer     ,               
  BS                integer     ,
  Fel               integer     ,
  Per               integer     ,
  Int_              integer     ,
  Agi               integer     ,
  WP                integer     ,
  Tough             integer     ,  
  PRIMARY KEY (Name_)           ,
  FOREIGN KEY (Class) REFERENCES Class(Class_name),
  FOREIGN KEY (World_Type) REFERENCES World_Type(Name_)     );

  CREATE TABLE world_class_requirements (
  World_Type        varchar (15) NOT NULL,
  Class_name        varchar (30) NOT NULL,
  PRIMARY KEY (World_Type, Class_name),
  FOREIGN KEY (World_Type) REFERENCES World_Type(Name_),
  FOREIGN KEY (Class_Name) REFERENCES Class(Class_name)     );

在character_中创建一个人时,它应该检查它是否可能有正确的组合,如果条件正确则插入,如果不正确则出错。但是,即使我故意插入无效的 worl_type 和 class 组合,它仍然会插入 character_ 表中。

world_class_requirements 中的值是:

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Feral World','Assassin');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Feral World','Guardsman');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Feral World','Imperial Psyker');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Feral World','Scum');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Hive World','Arbitrator');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Hive World','Assassin');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Hive World','Cleric');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Hive World','Guardsman');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Hive World','Imperial Psyker');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Hive World','Scum');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Hive World','Tech-Priest');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Imperial World','Adept');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Imperial World','Arbitrator');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Imperial World','Assassin');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Imperial World','Cleric');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Imperial World','Guardsman');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Imperial World','Imperial Psyker');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Imperial World','Scum');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Imperial World','Tech-Priest');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Void Born','Adept');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Void Born','Arbitrator');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Void Born','Assassin');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Void Born','Cleric');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Void Born','Imperial Psyker');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Void Born','Scum');

INSERT INTO world_class_requirements (World_Type, Class_name) VALUES (
'Void Born','Tech-Priest');

例如,不应允许“熟练”类来自 world_type“野性世界”,但它仍然接受它。

我在这里做错了什么?

【问题讨论】:

  • 一个 minimal 示例会很有帮助;) - 关于您的问题:您在哪里插入 character_ 与 world_class_requirements 进行检查?您的密钥只会阻止您将不在 class 或 World_type 中的内容插入到 world_class_requirements 中。
  • 啊,我明白了,所以我直接使用从 character_ 到 class 和 world_type 的键,而不是通过 world_class_requirements,对吗?

标签: mysql foreign-key-relationship key-value-store


【解决方案1】:

我认为问题在于character_ 表没有引用world_class_requirements 表。我认为您需要添加以下关系:

FOREIGN KEY (World_Type, Class) REFERENCES world_class_requirements(World_Type, Class),

【讨论】:

  • 我明白了,我已经添加了该代码,我收到错误错误代码:1215。无法添加外键约束。 @戈登林诺夫
  • 我可以想象它,因为在 worl_class_requirements 中,它的组合是唯一值,因为现在 Fkey 不是唯一的
  • @Santelices 。 . .在创建表之前添加条件。如果任何行失败,则无法添加条件。
猜你喜欢
  • 1970-01-01
  • 2017-05-29
  • 2018-09-04
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多