Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 当我们不';我们的表不需要主键吗?_Mysql_Sql_Database_Primary Key - Fatal编程技术网

Mysql 当我们不';我们的表不需要主键吗?

Mysql 当我们不';我们的表不需要主键吗?,mysql,sql,database,primary-key,Mysql,Sql,Database,Primary Key,我们会设计一个不需要主键的表吗?不会。 主键在幕后做了很多事情,即使应用程序从未使用过它 例如:提高效率(因为你的工作一团糟) 更不用说,如果有人必须在您的表上执行某些需要拉取特定行的操作,而您没有主键,那么您就是坏人。主键不是必需的,但创建没有主键的表不是一个好做法。DBMS在PK上创建自动索引,但您可以使列唯一并对其进行索引,例如,users表中的user\u name列通常是唯一的并被索引的,因此您可以选择在此处跳过PK。但这仍然是一个坏主意,因为PK可以用作引用完整性的外键 一般来说,除

我们会设计一个不需要主键的表吗?

不会。 主键在幕后做了很多事情,即使应用程序从未使用过它

例如:提高效率(因为你的工作一团糟)


更不用说,如果有人必须在您的表上执行某些需要拉取特定行的操作,而您没有主键,那么您就是坏人。

主键不是必需的,但创建没有主键的表不是一个好做法。DBMS在PK上创建自动索引,但您可以使列唯一并对其进行索引,例如,
users
表中的
user\u name
列通常是唯一的并被索引的,因此您可以选择在此处跳过PK。但这仍然是一个坏主意,因为PK可以用作引用完整性的外键

一般来说,除非您有非常充分的理由证明没有PK,否则您应该几乎总是在表中有PK

链接表(在多对多关系中)可能没有主键。但是,我个人也喜欢在这些表中包含PK。

是的。 如果您有一个总是被完全提取的表,并且被零个其他表引用,例如某种独立设置或配置表,那么没有主键的意义,一些人可能会提出这样的论点,即在这种情况下添加PK将是对正常使用这种表的欺骗

这种情况很少发生,而且可能在最常发生的情况下是错误的,但它们确实存在,而且这种情况可能是有效的。

视情况而定。 什么是主键/唯一键

在关系数据库设计中,唯一键可以唯一地标识表中的每一行,并且与超级键概念密切相关。唯一键由一列或一组列组成。如果不使用NULL值,则表中的两个不同行在这些列中不能具有相同的值(或值的组合)。根据其设计,表可能有任意多个唯一键,但最多有一个主键

因此,当您不必区分(唯一标识)每一行时,
您不必使用主键

例如,日志的大表,

在不使用主键的情况下,当数据中只有一行时,可以获得更小的数据大小和更快的插入速度

table@Shakti@EBAG,这是真的,但这是什么时候发生的?而且,2)将数据限制为始终只有一行是不好的做法。设计数据库时最好考虑到未来。我相信你是半开玩笑的,但是如果这个问题是合理的,那么EBAG需要知道,即使只有一行,没有主键也是个坏主意。@rockerest-当你想要一个表示各种配置选项的表时。您希望使用不同的列,以便为每个选项使用适当的数据类型(例如,如果您想要某个内容的重试值,则将其存储为int)。在这种情况下,您希望确保只有一行。当然,在这种情况下,理想的(理论上的)主键应该是没有列的主键,但我不知道有任何SQL产品允许您声明它。@Damien您所描述的场景是正确的,但我一直认为存储的东西保证是一行(如配置或设置信息)是关系数据库的巴斯德化。为什么要创建一个表并从该表中提取单个记录,而您可以将信息存储在其他地方呢?@Shakti,一个根据定义被限制只有一行的表确实有一个键-键是空的(一组空属性)。只是不能用SQL的主键约束直接指定它。主键!=主键:)同意:只需添加主键,不要再考虑它。我还向我的多对多表添加PK。不知道为什么,但我觉得在那里使用它们“更安全:)多对多表也应该有主键!不是因为感觉更安全,而是因为有了一种快速识别记录的方法。正如你在(几乎)所有其他表格中需要它一样,如其他答案中所述……但检索速度要慢得多。回到关于集群表和堆表的讨论。如果没有主键,从表中检索任何内容将花费更长的时间。为什么要在这样的表中重复行?当您说您永远不想“获取”单个行时,这是否意味着您永远不想更新它们,并且您会为数据的每次更改替换每一行?还是说数据是只读的?@dportas:你说的一切
unique
是防止重复行的一种方法。没有PK是一种表示不应从另一个表引用此表的方式。最常见的用例是经典的单记录设置表(通常无键表非常少见)。我认为省略定义PK是不好的,但强制要求每个表都必须有一个PK是错误的。如果是这样,我们就没有选择了。@crjh:同意“主键”总是多余的。我对你的回答的理解是你的意思是“根本没有钥匙”。如果您的意思是:“一个表应该至少有一个候选键,其中一个可以称为主键,也可以不称为主键”,那么我同意。被约束为只有一行的表不是例外,因为它隐式地有一个(空)键。@dportas:当然,我想我们在同一页上。