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)