数据库表定义里同时存在 primary key 和 key 是为何?

2017-07-09 20:40:03 +08:00
 guyeuro

如下定义

    CREATE TABLE `salaries` (
      `emp_no` int(11) NOT NULL,
      `salary` int(11) NOT NULL,
      `from_date` date NOT NULL,
      `to_date` date NOT NULL,
      PRIMARY KEY (`emp_no`,`from_date`),
      KEY `emp_no` (`emp_no`),
      CONSTRAINT `salaries_ibfk_1` FOREIGN KEY (`emp_no`) REFERENCES `employees` (`emp_no`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1

同时有 PRIMARY KEY (emp_no,from_date), KEY emp_no (emp_no),

我觉得既然 emp_no 在 主键索引里 为何还要单独定义一个 key ?

4318 次点击
所在节点    问与答
13 条回复
billlee
2017-07-09 22:06:59 +08:00
大概是因为设计这个表的人没学过数据库原理吧
guyeuro
2017-07-09 22:33:57 +08:00
@billlee 你认真的么??
sunriseyuen
2017-07-09 22:54:23 +08:00
看上去员工号码+日期才是唯一的
leoli
2017-07-09 23:21:48 +08:00
@sunriseyuen

对啊,PRIMARY KEY (emp_no,from_date),主键肯定是唯一的。后边那个 KEY 感觉意义不大。
lcorange
2017-07-09 23:33:54 +08:00
@leoli key 是为了优化用的,比如查询某个雇员的所有工资
wwqgtxx
2017-07-10 01:44:27 +08:00
那个 key 应该是当索引用的吧
choury
2017-07-10 02:03:03 +08:00
@wwqgtxx
@lcorange
主键就是 key,一个 key 的前缀也是索引,比如 key(a,b,c)查 a 或者 a,b 都会用到这个索引
11138
2017-07-10 02:04:15 +08:00
KEY `emp_no` (`emp_no`)
这个是多余的,用 explain 分析一下就清楚了。 @lcorange @wwqgtxx
kn007
2017-07-10 07:40:01 +08:00
KEY `emp_no` (`emp_no`) 多余+1
huigeer
2017-07-10 09:22:26 +08:00
innodb 这样建主键,dba 会哭晕。primkey 不是自增会影响 insert
leoli
2017-07-10 09:40:00 +08:00
@lcorange 优化过程是什么?某个员工必须靠 emp_no 和 from_date(应该是入职时间吧)来确定,查这个员工靠主键就行了吧
lcorange
2017-07-10 10:18:04 +08:00
@choury
@11138 学到了,我建个表试试


@leoli 这个应该是工资表,不是入职时间,是本次工资的起始发放时间
leoli
2017-07-10 12:12:32 +08:00
@lcorange 嗯,说的通。几遍如此,后边那个 key 应该也是多余的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/374114

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX