Mysql创建表,其中两个外键引用主键

时间:2018-01-12 07:12:09

标签: mysql

我有两个mysql表。第一个是使用以下代码创建的:

create table project(
project_id int not null auto_increment,
project_name varchar(30)
primary key(project_id));

第二张表:

create table matches(
match_id int not null auto_increment,
match_name varchar(30),
project_id int(4) foreign key (project_id) references projects(project_id));

这两个命令都可以正常工作。我想将project_name列从第一个表添加到第二个表。我尝试使用

alter table projects drop primary key, add primary key(project_id, project_name);

然后

alter table matches add column project_name varchar(30), add foreign key (project_name) references projects(project_name);

但是出现了以下错误:

ERROR 1005 (HY000): Can't create table 'matches.#sql-55e_311' (errno: 150)

如何将第一个表中的列包含在第二个表中。 我的第二个表的当前结构如下:

+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| match_id   | int(11)     | NO   | PRI | NULL    | auto_increment |
| match_name | varchar(30) | YES  |     | NULL    |                |
| project_id | int(4)      | NO   | MUL | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

我想将project_name添加为第二个表中的第四列。

2 个答案:

答案 0 :(得分:1)

  

要将复合主键用作外键,您必须添加   相同数量的列(组成PK)具有相同的数据类型   子表然后使用这些列的组合   FOREIGN KEY定义。

在此处查看相关帖子https://stackoverflow.com/a/10566463/4904726

所以试试这种方式

{{1}}

答案 1 :(得分:1)

你明白FK约束是什么意思吗?它表示表中某些列的值列表必须显示为在引用表中形成(声明的)PKUNIQUE NOT NULL的某些列的值列表。所以你写的东西没有意义。如果您想要 PK (project_id, project_name),那么这也应该是您的FK的形式。

但是(project_id, project_name)不是两个1列PK,它是一个2列PK,它可能不是你想要的,因为可能在projects中它不仅仅是唯一的对它是每一列。大概你想要两个1列PK和两个单列FK,一个引用每个PK。

如果projects project_idNOT NULL,您可以写:

alter table projects add primary key(project_name);
alter table matches add column project_name varchar(30),
    add foreign key (project_name) references projects(project_name);

但如果project_nameNULL projects可以UNIQUE,那么你就无法让它成为PK而且你不能明智地拥有它。你可以projectsUnfortunately MySQL lets you write such a FK declaration to a non-NULL UNIQUE column while it also tells you not to do it:

  

对于诸如UPDATE或DELETE CASCADE之类的操作,没有很好地定义对非唯一键或包含NULL值的键的外键引用的处理。建议您使用只引用UNIQUE(或PRIMARY)和NOT NULL的键的外键。

因此,如果您希望project_name UNIQUE可以为空,则应将其声明为matches,但您应该使用触发器强制执行逻辑project_name HBITMAP hBmp = CreateCompatibleBitmap(GetDC(0), width, height);匹配。