Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 1215添加两个外键时出错_Mysql_Foreign Keys - Fatal编程技术网

Mysql 1215添加两个外键时出错

Mysql 1215添加两个外键时出错,mysql,foreign-keys,Mysql,Foreign Keys,无法解决最后一个错误 我在创建锦标赛_表时遇到了1215错误,但无法解释,是因为我试图添加2个外键,但我做得不对吗?那我怎么做呢?我在互联网上找不到一个网站 如果我不能解决它,我脑子里的堆积如山的东西就会溢出 create table Poker_event (date_time datetime not null, min_players int not null, max_players int not

无法解决最后一个错误

我在创建锦标赛_表时遇到了1215错误,但无法解释,是因为我试图添加2个外键,但我做得不对吗?那我怎么做呢?我在互联网上找不到一个网站

如果我不能解决它,我脑子里的堆积如山的东西就会溢出

create table Poker_event
   (date_time       datetime    not null,
    min_players     int         not null,
    max_players     int         not null,
    house_number    int         not null, 
    postal_code     varchar(6)  not null,
primary key(date_time),
foreign key(house_number, postal_code)   references Location(house_number, postal_code) on delete cascade on update cascade);

create table Tournament
   (date_time   datetime    not null,
    prize       int         not null,
primary key(date_time),
foreign key(date_time)  references Poker_event(date_time) on delete no action on update cascade);

create table Tournament_round
   (round_nr    int       not null,
    date_time   datetime    not null,
primary key(date_time, round_nr),
foreign key(date_time)  references Tournament(date_time) on delete no action on update cascade);

create table Tournament_table
   (winner      int         not null,
    date_time   datetime    not null,
    round_nr    int         not null,
primary key(winner, date_time, round_nr),
foreign key(date_time)  references Tournament(date_time) on delete no action on update cascade,
foreign key(round_nr)   references Tournament_round(round_nr) on delete no action on update cascade)
回合编号不是锦标赛中的一列

锦标赛表格定义的最后一行:

 foreign key(round_nr) references Tournament(round_nr) 
                                  ^^^^^^^^^^^^^^^^^^^^
引用的列不存在。看起来你想让比赛桌成为比赛回合的一个孩子。在锦标赛回合中有一个复合主键ugghhh,外键约束需要包括这两列:

foreign key(date_time, round_nr) references Tournament_round(date_time,round_nr)
此外,在锦标赛的第一个表定义中,有一个外键引用表扑克事件。我们看不到引用的表,所以我们不知道这是否是一个问题。除了这两个问题之外,看起来这应该行得通

后续行动

默认的存储引擎是InnoDB

3 queries executed, 3 success, 0 errors, 0 warnings
Query: create table Tournament ( date_time datetime ...
0 row(s) affected
--------------------------------------------------
Query: create table Tournament_round ( round_nr int ...
0 row(s) affected
--------------------------------------------------
Query: create table Tournament_table ( winner int ...
0 row(s) affected
根据我使用关系数据库DB2、Oracle、SQL Server、MySQL、MariaDB的经验,我倾向于为每个实体表实现一个简单的代理主键。我区分实体表和其他表,例如值查找列表表和关系表,这些表纯粹是为了解析多对多关系而添加的。纯关系表不会有非键属性,并且本身也不会是另一个关系中的实体

显然,我还没有为您正在处理的特定问题域进行数据分析和实体关系建模。但是根据您展示的表定义,这里有一个使用代理键的等效表定义的示例。在我看来,id列不会违反3NF或BCNF,因为它们将被视为候选键,而不是非键属性。请注意,非匿名键属性(如date_time)已从子表中删除,因为这些属性现在将违反3NF,因为它们不依赖于键

CREATE TABLE poker_event
( id             INT UNSIGNED NOT NULL PRIMARY KEY COMMENT 'pk' 
, location_id    INT UNSIGNED NOT NULL COMMENT 'fk ref location.id'
, date_time      DATETIME     NOT NULL COMMENT 'event start time'
, min_players    INT          NOT NULL COMMENT 'minimum number of players'
, max_players    INT          NOT NULL COMMENT 'maximum number of players'
, UNIQUE KEY poker_event_UX1(date_time)
, CONSTRAINT FK_poker_event_location
    FOREIGN KEY (location_id) REFERENCES location(id)
);

CREATE TABLE tournament
( id             INT UNSIGNED NOT NULL PRIMARY KEY COMMENT 'pk'
, poker_event_id INT UNSIGNED NOT NULL COMMENT 'fk ref poker_event.id'
, prize          INT          NOT NULL COMMENT 'prize'
, CONSTRAINT FK_tournament_poker_event
    FOREIGN KEY (poker_event_id) REFERENCES poker_event(id)
);

CREATE TABLE tournament_round
( id             INT UNSIGNED NOT NULL PRIMARY KEY COMMENT 'pk'
, tournament_id  INT UNSIGNED NOT NULL COMMENT 'fk ref tournament.id'
, round_nr       INT          NOT NULL COMMENT 'round number'
, UNIQUE KEY tournament_round_UX1(tournament_id,round_nr)
, CONSTRAINT FK_tournament_round_tournament
    FOREIGN KEY (tournament_id) REFERENCES tournament(id)
);

CREATE TABLE tournament_table
( id                  INT UNSIGNED NOT NULL PRIMARY KEY COMMENT 'pk'
, tournament_round_id INT UNSIGNED NOT NULL COMMENT 'fk ref tournament_round.id'
, winner              INT NOT NULL COMMENT 'winner'
, UNIQUE KEY tournament_table_UX1(tournament_round_id,winner)
, CONSTRAINT FK_tournament_table_tournament_round
    FOREIGN KEY (tournament_round_id) REFERENCES tournament_round(id)
);
问题是

create table Tournament_table
   (winner      int         not null,
    date_time   datetime    not null,
    round_nr    int         not null,
primary key(winner, date_time, round_nr),
foreign key(date_time)  references Tournament(date_time) on delete no action on update cascade,
foreign key(round_nr)   references Tournament_round(round_nr) on delete no action on update cascade)
应该是的

create table Tournament_table
   (winner      int         not null,
    date_time   datetime    not null,
    round_nr    int         not null,
primary key(winner, date_time, round_nr),
foreign key(date_time, round_nr)   references Tournament_round(date_time, round_nr) on delete no action on update cascade);

显然,这是一个复合键

我将在那个表中编辑。我只是为了这篇文章变得太长而把它删掉了,但不知怎么的,我还是无法让它工作。我按我的方式工作,但是谢谢你的帮助。预测:那些组合键会变得很痛苦。我将使用名为id的简单整数代理键作为每个表的主键。外键列将命名为table_id,所以连接谓词的形式总是child.parent_id=parent.id。复合键是有效且受支持的,列名只是列名,因此您的设计是可行的。但我的预测是,你以后会希望你没有使用复合主键。我想这样做,但是。。。问题是,如果我那样做,我就不会通过这门课。我必须让我的数据库保持在第三个正常状态。在我看来,引入一个简单的代理主键不会违反Codd关于3NF的任何标准。只要候选键不重叠,它也不会影响Boyce Codd,它们不会重叠,因为我还将从锦标赛和锦标赛表中删除冗余的datetime属性。我不打算参加辩论;我将把它留给学术界来讨论,代孕主键的引入是否会对3NF造成暴力。我希望我的主键能够满足一系列需要的属性:简单、唯一、不可变、匿名……一旦系统启动、运行并投入生产。。。这就是新的需求被揭示的时候。哦,我们告诉你们的那个日期和时间在锦标赛中是独一无二的,但事实证明这并不是独一无二的。事实上,我们可以在不同的地点举办两次日期和时间相同的锦标赛。考虑适应这种需求的影响。选定为主键的候选键刚刚失去其唯一性。啊!这不仅仅影响锦标赛表和外键引用。它还影响连接到锦标赛表的每个SQL语句。。。一旦我的老师对我耍了这个把戏,我就把他们扔到公共汽车前面或者别的什么地方。在我看来,它们并不是独一无二的。我每周都要和我的老师一起评估,并和em一起评估了附带的RRM。他们说这很好。所以我会一直这样,直到他们说别的。
create table Tournament_table
   (winner      int         not null,
    date_time   datetime    not null,
    round_nr    int         not null,
primary key(winner, date_time, round_nr),
foreign key(date_time, round_nr)   references Tournament_round(date_time, round_nr) on delete no action on update cascade);