数据库表可以没有主键吗?

bod*_*ydo 40 mysql database sql-server

谁能告诉我关系数据库中的表(如MySQL/SQL SERVER)是否可以没有主键?

例如,我可以有桌子day_temperature,我注册temperaturetime.我没有看到为这样一个表创建主键的原因.

Qua*_*noi 32

从技术上讲,您可以声明这样的表格.

但是在你的情况下,time应该这样做PRIMARY KEY,因为在同一时间内有不同的温度可能是错误的,并且可能没有多次使用相同的温度.

从逻辑上讲,每个表应该有一个,PRIMARY KEY以便您可以区分两个记录.

如果你没有在你的数据的候选键,只需要创建一个代理一个(AUTO_INCREMENT,SERIAL或任何你的数据库报价).

没有a的唯一借口PRIMARY KEY是日志或类似的表格,这个表格很重,DML并且有一个索引,会影响超出容忍程度的性能.


Grz*_*lik 27

像往常一样取决于.

不必具有主键.更重要的是拥有正确的索引.在数据库引擎上取决于主键如何影响索引(即为主键列/列创建唯一索引).

但是,在您的情况下(以及99%的其他情况),我会添加一个新的自动增量唯一列,temp_id并使其成为代理主键.

更容易维护这个表 - 例如查找和删除记录(即重复的记录) - 并相信我 - 每个表都有时间来解决问题:(.


Joe*_*nez 13

主键自然不是时候吗?你会在给定的时间内有多个温度吗?

一个更好的问题是,"为什么你会做一张没有主键的桌子"

  • +1假设没有其他数据时间必须是逻辑主键.看不出你如何在同一时间获得2种不同的温度...... (2认同)

Avi*_*war 6

即使您没有向 MySQL 中的 InnoDB 表添加主键,MySQL 也会向该表添加隐藏的聚集索引。如果没有定义主键,MySQL 会定位第一个唯一索引,其中所有键列都不为 NULL,InnoDB 将其用作聚集索引。

如果表没有主键或合适的 UNIQUE 索引,InnoDB 会在包含行 ID 值的合成列上内部生成聚集索引 GEN_CLUST_INDEX。

https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html


p.m*_*ino 5

如果有重复条目(例如同一时间)的可能性不是问题,并且您不希望查询特定记录或记录范围,则可以不使用任何类型的密钥.


rek*_*o_t 5

你不需要PK,但建议你有一个PK.这是识别唯一行的最佳方式.有时你不需要自动增量int PK,而是在其他东西上创建PK.例如,在您的情况下,如果每次只有一个唯一的行,您应该在时间上创建PK.它可以更快地根据时间进行查找,并确保它们是唯一的(您可以确保不会违反数据完整性):