在设计表时,我的同事在这里说我应该避免使用标识列,因为它特定于SQL Server和MS Access,但我的观点不同,因为它使我的编码更简单。
我应该使用标识栏吗?如果不是从应用程序代码创建标识列的最佳方法是什么?
答案 0 :(得分:10)
您无法将应用程序与数据库供应商完全分开。如果这样做,您将无法利用数据库为您提供的任何功能。
我要说使用标识栏。如果转移到Oracle(例如),则可以使用序列。几乎没有什么大变化。
我不知道你正在使用什么技术,但有一点可以帮助我使用像Hibernate或iBATIS这样的工具(我认为它们都可以用于Java和.NET),它们将你与数据库实现细节。然后,如果您更改数据库供应商,则无需更改应用程序代码,只需更改配置。 (理论上,至少!)
答案 1 :(得分:5)
使用标识栏!
它确实将“应用逻辑”与“业务逻辑”分开。
假设您使用“email”作为主键(这在“业务逻辑”方面确实有意义)。当该电子邮件不再存在且您的用户想要编辑您的电子邮件时,您会遇到麻烦。
答案 2 :(得分:3)
据我所知,每个稍微严重的RDBMS每个表都有一些独特的编号方案。
我主要使用它,理论上它并不总是一个要求,但如果你想保持参照完整性,int比存储更少,比varchar更容易比较,特别是如果你的外键比单个列更复杂。
答案 3 :(得分:2)
除非您完全了解其缺陷并且没有正当理由使用SEQUENCE或模拟序列生成器,否则请勿使用标识列。
序列更灵活,没有Identity列所具有的缺点/限制。
来自http://www.jumpingbean.co.za/blogs/mark/identity_autoincrement_fields_and_database_sequences:
自动递增的痛苦
同时复制数据 保留身份价值
自动递增键可以成为 你需要复制整个时的痛苦 表格并保留主键 值。试图直接插入 一个标识列将导致一个 提出错误。通常是 供应商提供了一些陈述 让你暂时放弃 约束,以便您可以插入现有的 值。在MSSQL中你可以发布 命令
“SET IDENTITY_INSERT产品开启”。
其他供应商会要求您放弃 约束然后重新启用它。
更多痛苦 - 如何检索价值 新插入的行?
另外服务器通常 提供不同的检索方式 新的标识列值 插入行。对于MySQL,这是 LAST_INSERT_ID()函数和for MSSQL是@@ identity,例如select @@身份。
MS SQL Server 2011将支持SEQUENCE。
如果您使用不支持SEQUENCE的RDBMS服务器(如MSSQL 2011之前或MySQL),则有两种选择: