每个表都应该有主键吗?

2024-04-25

我正在创建一个数据库表,但没有为其分配逻辑主键。每个表都应该有主键吗?


简短回答:yes.

长答案:

  • 你需要你的桌子可以加入一些东西
  • 如果您希望表聚集,则需要某种主键。
  • 如果您的表设计不需要主键,请重新考虑您的设计:很可能您遗漏了某些内容。为什么要保留相同的记录?

在 MySQL 中,如果您没有明确指定主键,InnoDB 存储引擎总是会创建一个主键,从而创建一个您无权访问的额外列。

请注意,主键可以是复合的。

如果您有一个多对多链接表,则可以在链接中涉及的所有字段上创建主键。因此,您可以确保没有两条或更多记录描述一个链接。

除了逻辑一致性问题之外,大多数 RDBMS 引擎还将受益于将这些字段包含在唯一索引中。

由于任何主键都涉及创建唯一索引,因此您应该声明它并获得逻辑一致性和性能。

请参阅我博客中的这篇文章,了解为什么应始终对唯一数据创建唯一索引:

  • 使索引唯一 http://explainextended.com/2009/04/23/making-an-index-unique/

P.S.有一些非常非常不需要主键的特殊情况。

大多数情况下,它们包括日志表,但没有any出于性能原因的索引。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个表都应该有主键吗? 的相关文章

  • 使用 MySQL Workbench 创建新数据库

    作为 MySQL 新手 我安装了最新版本的 MySQL Workbench 5 2 33 我想知道如何使用此应用程序创建数据库 在 SQL 编辑器的 概述 选项卡中 几乎没有显示 MySQL 架构 这些架构是现有数据库吗 启动 MySQL
  • 如何从其他表填充表的外键

    我有以下表格 其中translation是空的 我正在尝试填充 translation id translated language id template id language id langname langcode template
  • 如何使用过程更改列的默认值

    这是我当前的 SQL 的样子 DELIMITER CREATE PROCEDURE updateDefaultUserRole IN rid in INT BEGIN ALTER TABLE users MODIFY rid INT 255
  • 什么时候空值在列中“安全”?

    设计数据库时是否存在允许列为空与 3nf 规范化的一般经验法则 我有一个表 其中的列主要由空值 85 组成 但表大小不超过 10K 记录 不是很大 它主要用于日志记录和记录保存 因此大多数事务将是插入和选择 而不是更新 我试图同时考虑性能和
  • ruby-on-rails 检查查询结果是否为空(Model.find)

    我正在 Rails 上使用 ruby 并尝试检查查询是否返回值 这是查询 search Customer find by name login name 如果查询找到结果 一切都很好 但是我如何对空结果做出反应 I tried if sea
  • Django ORM 是否具有与 SQLAlchemy 的混合属性等效的功能?

    In SQL炼金术 http docs sqlalchemy org en rel 0 7 index html a 混合属性 http docs sqlalchemy org en rel 0 7 orm extensions hybri
  • 从 MySQL 执行 shell 命令

    我知道我正在寻找的可能是一个安全漏洞 但由于我设法在 Oracle 和 SQL Server 中做到了这一点 所以我会尝试一下 我正在寻找一种从 MySQL 上的 SQL 脚本执行 shell 命令的方法 如有必要 可以创建和使用新的存储过
  • PHP - 多个不同的数据库依赖注入类

    我花了过去几个小时试图找到 最佳 最合乎逻辑的方法的答案 以编写一个 php 数据库类以同时连接到一个 postgresql 数据库和一个 mysql 数据库 另外 我想采用依赖注入设计 但对整个概念还是陌生的 到目前为止我已经想出了 cl
  • Sequel Pro / MAMP 在哪里存储本地数据库?

    我通过 Sequel Pro 和 MAMP 在我的计算机上创建了一些数据库 并运行 localhost 来查看它们 但是 我全新安装了 Mac OS Lion 但忘记将数据库备份到 sql 文件 我会定期备份文件 并预装计算机的副本 有谁知
  • PHP/HTML 添加删除按钮

    我有下面的代码来从数据库中检索行 其中用户名列与基本目录名称匹配 username basename dirname FILE username mysql real escape string username result mysql
  • C# - 如何检测 SQLite DB 是否被锁定?

    我正在开发一个使用 SQLite 的多线程 C 程序 我遇到一个问题 有时运行 SQLiteCommand ExecuteNonQuery 来更新某些行会抱怨 SQLite 错误 5 数据库已锁定 我知道发生这种情况是因为数据库在插入或更新
  • 存储DotNetOpenAuth信息和用户信息检索

    这个问题有点结构 设计问题 因为我无法找出执行任务的最佳方法 在我的 MVC 应用程序中 我使用 DotNetOpenAuth 3 4 作为我的登录信息提供程序 并且仅使用标准FormsAuthentication用于饼干等 DB中当前用户
  • 具有数百万行的日志表。怎么办?

    我有一个包含数百万行的日志表 我正在考虑将数据分成多个表 即 LoginHistory ExceptionHistory PaymentProcessingHistory 等 在采用包含许多行 而不是列 的大型表并创建多个表时使用的术语是什
  • 始终保持数据库连接打开可以吗?

    我在业余时间从事单用户桌面数据库应用程序之类的工作 并且我总是不确定我所做的设计选择 现在 就目前情况而言 每当用户想要与数据库 这是一个本地 SQLite 数据库 因此通常只有一个用户一次看到它 交互时 应用程序就会创建一个新连接 执行它
  • 具有多个数据源 Oracle 和 H2 的 Spring Boot

    我为我的 Angular 项目开发了一个 Spring Boot RestController 并遇到了问题 在我的休息服务逻辑中 我使用了两个不同的数据库来获取数据 在这里您可以看到数据源配置 应用程序 属性 datasource1 sp
  • 根据代码版本测试和管理数据库版本

    当您开发应用程序时 数据库的更改不可避免地会出现 我发现的技巧是让数据库构建与代码保持同步 过去 我添加了一个针对目标数据库执行 SQL 脚本的构建步骤 但这很危险 因为您可能会无意中添加虚假数据或更糟的情况 我的问题是保持数据库与代码同步
  • SQLSTATE[HY000] [2002] 连接尝试失败,因为连接方在一段时间后没有正确响应,

    我尝试连接 2 个数据库Laravel 5 6项目 但我遇到这样的错误 SQLSTATE HY000 2002 连接尝试失败 因为连接方在一段时间后没有正确响应 或者由于连接的主机未能响应而建立的连接失败 SQL 从中选择 mt merch
  • 非关系型数据库系统

    还有哪些其他类型的数据库系统 我最近遇到了以非关系方式处理数据的 couchDB 这让我思考其他人正在使用哪些其他模型 所以 我想知道还有哪些其他类型的数据模型 我不是在寻找任何细节 只是想看看其他人是如何处理数据存储的 我的兴趣纯粹是学术
  • django.core.exceptions.ImproperlyConfigured:加载 MySQLdb 模块时出错:没有名为 MySQLdb 的模块

    我在尝试连接 mysql 数据库时遇到的问题 我还给出了我使用过的数据库设置 Traceback most recent call last File manage py line 10 in
  • 如何在javascript中设置从数据库输入的最大数量?

    我希望根据数据库中的数量设置 输入类型 数字 中输入的最大数量 目前 我正在尝试让它在数据最大的基础上工作 然后再尝试从数据库中获取最大值 但它似乎无法工作 之前已经在这里问过 但我仍然无法理解 在 php javascript 中设置数据

随机推荐