【问题标题】:Primary key versus key主键与键
【发布时间】:2011-01-13 01:06:01
【问题描述】:

创建包含我的数据库结构的 mysql 转储时,其中一个表显示如下:

CREATE TABLE `completedTransactions` (
  `paymentId` int(10) unsigned NOT NULL,
  `timestamp` int(15) unsigned NOT NULL,
  `actionTaken` varchar(25) NOT NULL,
  `response` varchar(255) NOT NULL,
  `responseCode` int(5) NOT NULL,

  PRIMARY KEY  (`paymentId`,`timestamp`),
  KEY `paymentId` (`paymentId`),

主键是我所期待的,但我不确定最后一行是什么?

KEY `paymentId` (`paymentId`),

这与索引有关吗?

【问题讨论】:

  • 我想知道为什么在这种情况下会在 paymentId 上创建一个附加索引,因为主键也应该是一个索引。所以,恕我直言,附加索引(键)已过时。
  • @Frederik:主键是复合键,因此它的索引将基于此。仅基于 paymentId 进行搜索时,该索引可能没有用。
  • @Frederik Gheysels:由于paymentIdtimestamp 都属于主键,因此会在这两个字段上创建索引。所以可以为paymentId创建一个额外的索引。
  • @T.J. Crowder:看起来主键的复合索引的顺序意味着paymentId 上的查询仍然可以有效地使用该索引,而不需要额外的索引。
  • @T.J.克劳德:我不同意。由于 paymentId 是复合主键中的第一列,因此当您仅搜索 paymentId 时仍会使用该索引。添加一个关于时间戳的额外查询(如果有对该列进行过滤的查询)会更有益,因为在搜索时间戳时,无法使用 PK 上存在的索引。

标签: mysql primary-key key


【解决方案1】:

是的,KEY 关键字只是 INDEX 关键字的别名。

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
  ...
  {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
      [index_option] ...

来源:MySQL Documentation: CREATE TABLE

【讨论】:

    【解决方案2】:

    引用CREATE TABLE的文档:

    KEY 通常是INDEX 的同义词。
    关键属性PRIMARY KEY也可以 在给出时指定为 KEY 列定义。这是 为兼容而实施 其他数据库系统。

    【讨论】:

      【解决方案3】:

      KEY 不是唯一的,PRIMARY KEYUNIQUE KEY 是唯一的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 2012-11-18
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多