bod*_*ydo 40 mysql database sql-server
谁能告诉我关系数据库中的表(如MySQL/SQL SERVER)是否可以没有主键?
例如,我可以有桌子day_temperature,我注册temperature和time.我没有看到为这样一个表创建主键的原因.
Qua*_*noi 32
从技术上讲,您可以声明这样的表格.
但是在你的情况下,time应该这样做PRIMARY KEY,因为在同一时间内有不同的温度可能是错误的,并且可能没有多次使用相同的温度.
从逻辑上讲,每个表应该有一个,PRIMARY KEY以便您可以区分两个记录.
如果你没有在你的数据的候选键,只需要创建一个代理一个(AUTO_INCREMENT,SERIAL或任何你的数据库报价).
没有a的唯一借口PRIMARY KEY是日志或类似的表格,这个表格很重,DML并且有一个索引,会影响超出容忍程度的性能.
Grz*_*lik 27
像往常一样取决于.
表不必具有主键.更重要的是拥有正确的索引.在数据库引擎上取决于主键如何影响索引(即为主键列/列创建唯一索引).
但是,在您的情况下(以及99%的其他情况),我会添加一个新的自动增量唯一列,temp_id并使其成为代理主键.
它更容易维护这个表 - 例如查找和删除记录(即重复的记录) - 并相信我 - 每个表都有时间来解决问题:(.
Joe*_*nez 13
主键自然不是时候吗?你会在给定的时间内有多个温度吗?
一个更好的问题是,"为什么你会做一张没有主键的桌子"
即使您没有向 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
你不需要PK,但建议你有一个PK.这是识别唯一行的最佳方式.有时你不需要自动增量int PK,而是在其他东西上创建PK.例如,在您的情况下,如果每次只有一个唯一的行,您应该在时间上创建PK.它可以更快地根据时间进行查找,并确保它们是唯一的(您可以确保不会违反数据完整性):