guyeuro
V2EX  ›  问与答

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

  •  
  •   guyeuro · Jul 9, 2017 · 5360 views
    This topic created in 3240 days ago, the information mentioned may be changed or developed.

    如下定义

        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 replies    2017-07-10 12:12:32 +08:00
    billlee
        1
    billlee  
       Jul 9, 2017
    大概是因为设计这个表的人没学过数据库原理吧
    guyeuro
        2
    guyeuro  
    OP
       Jul 9, 2017
    @billlee 你认真的么??
    sunriseyuen
        3
    sunriseyuen  
       Jul 9, 2017 via Android
    看上去员工号码+日期才是唯一的
    leoli
        4
    leoli  
       Jul 9, 2017
    @sunriseyuen

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


    @leoli 这个应该是工资表,不是入职时间,是本次工资的起始发放时间
    leoli
        13
    leoli  
       Jul 10, 2017
    @lcorange 嗯,说的通。几遍如此,后边那个 key 应该也是多余的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2674 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 11:01 · PVG 19:01 · LAX 04:01 · JFK 07:01
    ♥ Do have faith in what you're doing.