我有两个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添加为第二个表中的第四列。
答案 0 :(得分:1)
要将复合主键用作外键,您必须添加 相同数量的列(组成PK)具有相同的数据类型 子表然后使用这些列的组合 FOREIGN KEY定义。
在此处查看相关帖子https://stackoverflow.com/a/10566463/4904726
所以试试这种方式
{{1}}
答案 1 :(得分:1)
你明白FK约束是什么意思吗?它表示表中某些列的值列表必须显示为在引用表中形成(声明的)PK
或UNIQUE NOT NULL
的某些列的值列表。所以你写的东西没有意义。如果您想要 PK (project_id, project_name)
,那么这也应该是您的FK的形式。
但是(project_id, project_name)
不是两个1列PK,它是一个2列PK,它可能不是你想要的,因为可能在projects
中它不仅仅是唯一的对它是每一列。大概你想要两个1列PK和两个单列FK,一个引用每个PK。
如果projects
project_id
为NOT 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_name
中NULL
projects
可以UNIQUE
,那么你就无法让它成为PK而且你不能明智地拥有它。你可以projects
。 Unfortunately 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);
匹配。