什么是最好的,与DBMS无关的方式来生成一个ID号,将立即在INSERT语句中使用,保持ID的大致顺序?什么是为SQL插入生成ID的最佳方法?
回答
DBMS独立?这是一个问题。两种最常用的方法是自动递增列和序列,而大多数DBMS只执行一个或另一个,但不能同时执行这两个操作。所以独立于数据库的方式是让另一个表中包含一列的值,并锁定,选择,更新和解锁。
通常我会说“地狱与DBMS独立性”,并与PostgreSQL中的序列或MySQL中的自动增量列一起使用。就我的目的而言,支持这两种方法比试图找出一种无处不在的方式要好。
使用自动递增的id列。
有自动递增或序列
什么是这一点,那就是你最担心的?
你将如何处理SQL本身? MySQL有限制,
SQL Server有顶,
甲骨文排名
然后有100万其他像触发器,如果alter table语法等等等等
如果你可以创建一个Globally Unique Identifier (GUID)在你选择的编程语言 - 认为这是你的ID。
在排除故障时(输入INT为where
的条件要容易得多),但它们还有一些优点。通过在本地分配GUID作为您的密钥,您可以轻松构建父 - 子记录关系,而不必先将父级保存到数据库并检索该ID。而且由于GUID根据定义是唯一的,所以您不必担心在服务器上增加密钥。
真的有一个理由,他们必须按顺序?如果您只是将它用作ID,那么您应该只能使用UUID的一部分或md5(now())的前几位数字。
你可以花时间和按摩它。它会成为像
DateTime.Now.Ticks
相当于所以是这样的YYYYMMDDHHMMSSSS
是的,在原始SQL的明显的方式(在我的优先顺序排列)是:a)序列B)自动增量字段。更好,更现代,更独立于DBMS的方法是根本不触及SQL,而是使用(良好)ORM。
没有通用的方法来做到这一点。如果有的话,每个人都会使用它。按照定义,SQL定义会憎恶这个想法 - 它是基于集合逻辑的反模式(尽管在很多实际案例中是一个有用的逻辑)。
您试图从别处插入标识值的最大问题是,SQL语句涉及多个记录,并且必须同时生成多个值。
如果您需要它,请将它作为数据库选择要求的一部分,以便与您的应用程序一起使用。任何严重的DBMS产品都将提供自己的机制来使用,并且很容易就可以对DML中的差异进行编码。这些变体几乎都在DDL中。
我总是会为数据库特定的解决方案,但如果你真的有这样做的通常方式是实现你自己的序列。您的RDBMS必须支持事务。
您创建一个包含int列的顺序表,并与第一号种子这一点,您的交易逻辑,然后看起来像这样
begin transaction update tblSeq set intID = intID + 1 select @myID = intID from tblSeq inset into tblData (intID, ...) values (@myID, ...) end transaction
事务强制写入锁定使得然后下一个排队插入在记录插入到tblData之前,不能更新tblSeq值。只要所有插入都通过此事务,那么您生成的ID就是按顺序排列的。
它可能有点侧面的方法,但一个好的ORM类型的库可能至少可以隐藏这些差异。例如,在Ruby中,有ActiveRecord(通常用于但不完全绑定到Ruby the Rails Web框架),它具有Migrations。在平台不可知的代码中声明的表定义中,实现细节(如数据类型,顺序标识生成和索引创建)被推到视角之下。
我已经透明地在SQLite上开发了一个模式,然后在MS SQL Server上实现它,并在稍后移植到Oracle。永远不要改变生成我的模式定义的代码。
正如我所说,它可能不是你正在寻找的东西,但封装各种不同的最简单方法是使用一个已经为你完成封装的库。
由于只有SQL,下面可能是一个对的方法:
- 创建一个表包含起始编号为您的需求
- 当应用程序部署在第一时间,应用程序应该读在其上下文中的价值。
- 之后根据需要 3.1写ID到数据库(以线程安全的方式)增量ID(以线程安全的方式),它始终保持更新值 3.2不要将其写入数据库,不断递增在内存(线程安全的方式)
- 如果由于某种原因服务器正在下降,值电流id写入数据库
- 当服务器再次它将从离开的地方挑,最后一次。
- 1. 生成bit.ly或twitpic风格id的最佳方法是什么?
- 2. 什么是生成唯一会话ID的最佳方式?
- 3. 什么是为SQL Server表自动生成INSERT语句的最佳方法?
- 4. 将用户输入放入生成的javascript的最佳方法是什么?
- 5. 在SQL中生成datetime的最方便的方法是什么?
- 6. 验证记录是否成功插入的最佳方法是什么?
- 7. 从dotnet类生成xsd xml-scheme的最佳方法是什么?
- 8. 什么是自动生成主键的最佳方法?
- 9. 设置光标/插入位置的最佳方法是什么?
- 10. 在VB.NET中嵌入SQL的最佳方法是什么
- 11. 防止SQL注入mysql的最佳方法是什么
- 12. MySQL并发插入,为什么会发生,以及处理它的最佳方法是什么?
- 13. 什么是SQL插入一堆行的最快方法
- 14. 为散列生成唯一分数的最佳方法是什么
- 15. 在java中为neo4j节点生成juuid的最佳方法是什么
- 16. 为分类问题生成假数据的最佳方法是什么?
- 17. 键入()的最佳方式是什么?
- 18. 使用EF在oracle中获取插入ID的最佳方式是什么?
- 19. 在SQL Server中执行批量插入忽略并返回id的最佳方法是什么?
- 20. 生成(漂亮的)路线图的最佳方式是什么?
- 21. 通过Ajax调用传递ID的最佳方法是什么?
- 22. 从文件名中检索ID的最佳方法是什么?
- 23. 什么是生成REST API文档的最佳方式?
- 24. 什么是通过xls生成kml文件的最佳方式
- 25. 什么是生成站点地图的最佳方式
- 26. 在PowerCenter中生成日历表的最佳方式是什么?
- 27. 什么是生成此字符串的最佳方式? (NSMutableString ...)
- 28. 在C#中生成KML文件的最佳方式是什么?
- 29. 从Oracle生成.xlsm文件的最佳方式是什么?
- 30. 什么是从.NET生成SPSS .SAV文件的最佳方式?
我认为,通过“独立于数据库管理系统”,他意味着自动增量列是不可能的。生成这种列的语法对于所有常用数据库来说都不相同。 – 2009-02-24 17:52:13
这是DMBS依赖。 – 2009-02-24 17:52:34
许多流行的DBMS没有任何类型的自动增量列类型。 – 2009-02-24 17:52:44