guyeuro
V2EX  ›  问与答

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

  •  
  •   guyeuro · Jul 9, 2017 · 5873 views
    This topic created in 3405 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
    billlee
    Jul 9, 2017
    1
    大概是因为设计这个表的人没学过数据库原理吧
    guyeuro
    guyeuro
    OP
    Jul 9, 2017
    2
    @billlee 你认真的么??
    sunriseyuen
    sunriseyuen
    Jul 9, 2017 via Android
    3
    看上去员工号码+日期才是唯一的
    leoli
    leoli
    Jul 9, 2017
    4
    @sunriseyuen

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


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