Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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唯一id或组合id_Mysql_Primary Key - Fatal编程技术网

MySQL唯一id或组合id

MySQL唯一id或组合id,mysql,primary-key,Mysql,Primary Key,我的项目和开发人员计划的结构如下: developer table id developer name etc... project table id project name etc... developer _project table ??? 因为一个开发人员可以在多个项目中,一个项目可以有多个开发人员,所以我必须创建一个新表,但从我读到的内容来看,他们没有告诉我应该使用什么id 如果我使用id自动递增+用户\u id+项目\u id,由于id是主键,我会有重复的id吗?组合表(在M

我的项目和开发人员计划的结构如下:

developer table
id
developer name
etc...

project table
id
project name
etc...

developer _project table
???
因为一个开发人员可以在多个项目中,一个项目可以有多个开发人员,所以我必须创建一个新表,但从我读到的内容来看,他们没有告诉我应该使用什么id

如果我使用id自动递增+用户\u id+项目\u id,由于id是主键,我会有重复的id吗?

组合表(在MySQL workbench中自动称为“developer\u has\u project”)应该使用组合主键(developer,project)。如果向该键(ID)添加第三列,则它不再必须是唯一的:

(id,developer,project)
(1,1,1)
(2,1,1)
(3,1,1)
仅使用开发人员和项目,它将工作:

(developer,project)
(1,1)
(1,1) <-- error!
(2,1)
(开发者、项目)
(1,1)

(1,1)使用唯一的组合键:

CREATE TABLE `developer_project` (
 developer_id INT(10) UNSIGNED /* etc... */,
 project_id INT(10) UNSIGNED /* etc... */,
 PRIMARY KEY dev_project (developer_id, project_id)
);
如果您创建一个
ID
,您可能永远不会使用它,因为您将在
左连接中查询开发人员ID和/或项目ID


注意:确保列定义与
developer
project
表相同

对于多对多关系,您可以简单地使用两个字段的复合主键

示例(假设项目id和开发人员id均为整数):

创建表“开发者项目”( `开发者id`INT不为空, `项目_id`INT不为空, 主键(`developer\u id`、`project\u id`) ) 要么:

developer_project table
developer_id
project_id
PRIMARY KEY (developer_id, project_id)



我建议你使用第一种选择,除非你有理由不这样做。有一些orm不能很好地处理复合(主)键。

为什么它们需要相同的定义?假设您从developer表中有
INT UNSIGNED
(最大值4294967295,因为是UNSIGNED)和
tinyint
(最大值是127,因为它的有符号-没有定义
UNSIGNED
字)在交集表中。由于已达到交集表中的最大值,它插入的值不会超过此值,它将在127处停止(您将在第1行获得:
列“developer\u id”的值超出范围)。阅读更多:
CREATE TABLE `developer_project` (
  `developer_id` INT NOT NULL ,
  `project_id` INT NOT NULL ,
  PRIMARY KEY (  `developer_id` ,  `project_id` )
)
developer_project table
developer_id
project_id
PRIMARY KEY (developer_id, project_id)
developer_project table
id
developer_id
project_id
PRIMARY KEY (id)
UNIQUE KEY (developer_id, project_id)