2009-02-24 276 views

回答

10

DBMS独立?这是一个问题。两种最常用的方法是自动递增列和序列,而大多数DBMS只执行一个或另一个,但不能同时执行这两个操作。所以独立于数据库的方式是让另一个表中包含一列的值,并锁定,选择,更新和解锁。

通常我会说“地狱与DBMS独立性”,并与PostgreSQL中的序列或MySQL中的自动增量列一起使用。就我的目的而言,支持这两种方法比试图找出一种无处不在的方式要好。

0

使用自动递增的id列。

+0

我认为,通过“独立于数据库管理系统”,他意味着自动增量列是不可能的。生成这种列的语法对于所有常用数据库来说都不相同。 – 2009-02-24 17:52:13

+0

这是DMBS依赖。 – 2009-02-24 17:52:34

+0

许多流行的DBMS没有任何类型的自动增量列类型。 – 2009-02-24 17:52:44

1

有自动递增或序列

什么是这一点,那就是你最担心的?

你将如何处理SQL本身? MySQL有限制,

SQL Server有顶,

甲骨文排名

然后有100万其他像触发器,如果​​alter table语法等等等等

5

如果你可以创建一个Globally Unique Identifier (GUID)在你选择的编程语言 - 认为这是你的ID。

在排除故障时(输入INT为where的条件要容易得多),但它们还有一些优点。通过在本地分配GUID作为您的密钥,您可以轻松构建父 - 子记录关系,而不必先将父级保存到数据库并检索该ID。而且由于GUID根据定义是唯一的,所以您不必担心在服务器上增加密钥。

0

真的有一个理由,他们必须按顺序?如果您只是将它用作ID,那么您应该只能使用UUID的一部分或md5(now())的前几位数字。

0

你可以花时间和按摩它。它会成为像

DateTime.Now.Ticks 

相当于所以是这样的YYYYMMDDHHMMSSSS

1

是的,在原始SQL的明显的方式(在我的优先顺序排列)是:a)序列B)自动增量字段。更好,更现代,更独立于DBMS的方法是根本不触及SQL,而是使用(良好)ORM。

1

没有通用的方法来做到这一点。如果有的话,每个人都会使用它。按照定义,SQL定义会憎恶这个想法 - 它是基于集合逻辑的反模式(尽管在很多实际案例中是一个有用的逻辑)。

您试图从别处插入标识值的最大问题是,SQL语句涉及多个记录,并且必须同时生成多个值。

如果您需要它,请将它作为数据库选择要求的一部分,以便与您的应用程序一起使用。任何严重的DBMS产品都将提供自己的机制来使用,并且很容易就可以对DML中的差异进行编码。这些变体几乎都在DDL中。

1

我总是会为数据库特定的解决方案,但如果你真的这样做的通常方式是实现你自己的序列。您的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就是按顺序排列的。

0

它可能有点侧面的方法,但一个好的ORM类型的库可能至少可以隐藏这些差异。例如,在Ruby中,有ActiveRecord(通常用于但不完全绑定到Ruby the Rails Web框架),它具有Migrations。在平台不可知的代码中声明的表定义中,实现细节(如数据类型,顺序标识生成和索引创建)被推到视角之下。

我已经透明地在SQLite上开发了一个模式,然后在MS SQL Server上实现它,并在稍后移植到Oracle。永远不要改变生成我的模式定义的代码。

正如我所说,它可能不是你正在寻找的东西,但封装各种不同的最简单方法是使用一个已经为你完成封装的库。

0

由于只有SQL,下面可能是一个对的方法:

  1. 创建一个表包含起始编号为您的需求
  2. 当应用程序部署在第一时间,应用程序应该读在其上下文中的价值。
  3. 之后根据需要 3.1写ID到数据库(以线程安全的方式)增量ID(以线程安全的方式),它始终保持更新值 3.2不要将其写入数据库,不断递增在内存(线程安全的方式)
  4. 如果由于某种原因服务器正在下降,值电流id写入数据库
  5. 当服务器再次它将从离开的地方挑,最后一次。
相关问题