V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
guyeuro
V2EX  ›  问与答

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

  •  
  •   guyeuro · 2017-07-09 20:40:03 +08:00 · 4306 次点击
    这是一个创建于 2475 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如下定义

        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 ?

    13 条回复    2017-07-10 12:12:32 +08:00
    billlee
        1
    billlee  
       2017-07-09 22:06:59 +08:00
    大概是因为设计这个表的人没学过数据库原理吧
    guyeuro
        2
    guyeuro  
    OP
       2017-07-09 22:33:57 +08:00
    @billlee 你认真的么??
    sunriseyuen
        3
    sunriseyuen  
       2017-07-09 22:54:23 +08:00 via Android
    看上去员工号码+日期才是唯一的
    leoli
        4
    leoli  
       2017-07-09 23:21:48 +08:00
    @sunriseyuen

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


    @leoli 这个应该是工资表,不是入职时间,是本次工资的起始发放时间
    leoli
        13
    leoli  
       2017-07-10 12:12:32 +08:00
    @lcorange 嗯,说的通。几遍如此,后边那个 key 应该也是多余的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3891 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:06 · PVG 13:06 · LAX 22:06 · JFK 01:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.