鸡毛求救信--请问如何为新增的Record得到一个唯一的ID号

strangecat 2000-07-28 06:56:00
我的数据库的一个表中,每一个record都有一个唯一的ID号.请问怎样才能自动得到一个新的唯一的ID号呢? (用ODBC或者SQL都可以)
...全文
418 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
strangecat 2000-10-08
  • 打赏
  • 举报
回复
首先对于诸位高手的指点不胜感激.诸位精彩的回答实在是让小弟开眼界.之所以迟迟没有把分数送给大家,是因为送分之后此问题将从"我的问题"一栏里面消失,从此之后再也难觅踪迹.因为大家的回答是在是精彩,我实在是舍不得.

在此希望大家向站长呼吁一下,建立"我参加的问题"和"我被解答的问题"两个连接,方便查阅自己以前提出并被解答的问题.

再次谢谢大家.

nononono 2000-10-05
  • 打赏
  • 举报
回复
请教: 在向一个有identity字段的表中插入记录时, 如果没有建立唯一索引,会发生identity不唯一的情况吗? 什么情况下会发生? 建立唯一索引后, 会有其他问题吗? 谢谢
Fxx 2000-10-01
  • 打赏
  • 举报
回复
如果数据库是Oracle,用序列吧
JGTM2000 2000-09-28
  • 打赏
  • 举报
回复
补充,SQL Server中的identity和Oracle中的sequence都是内部自动增量计数机制。另外一些数据库有select max(XXXID) from table的用法,不过这种方法一般将导致表锁定从而影响整体的性能和可伸缩性。
JGTM2000 2000-09-28
  • 打赏
  • 举报
回复
Identity + PK字段: 可用于表内标识一行纪录(用于库内表连接)
Timestamp字段:用于在事务中区别特定纪录的版本变化(用于避免死锁的情形)
uniqueidentifier(GUID)字段:用于在任意时间、空间中标识纪录(比如用在异构数据库的数据关联)

就事论事,如果你用SQL Server,只需指定字段的属性为int(或其他整形数字类型)并施加PK(primary key)即可。
ycp2000 2000-09-25
  • 打赏
  • 举报
回复
guanzhu
Tommy Chang 2000-08-10
  • 打赏
  • 举报
回复
其实,有个id号也是希望它自动增长,如果用乱序的东西,将来很难从id区分两条纪录的先后纪录,分批处理数据也不方便。所以sequence还是首选。

:)
Tommy Chang 2000-08-10
  • 打赏
  • 举报
回复
天呐,guid都可以用?有见地。不过不太符合普通用法。

:)
  • 打赏
  • 举报
回复
也可以用GUID呀
lczddd 2000-08-10
  • 打赏
  • 举报
回复
给yiwei加分
halfdream 2000-07-30
  • 打赏
  • 举报
回复
我并不认为用Timestamp 完美。
一个索引建立在Timestamp字段上应该并不爽吧。
不过alexela说得也对,
用IDENTITY字段不能保证你的行是唯一的,除非你在该字段上建立唯一索引,
其实很多情况下是缺省的,不必太费心, 就算是建立索引应该也不是麻烦的事情吧。

yiwei 2000-07-28
  • 打赏
  • 举报
回复
基本知识

1. IDENTITY 列不能由用户直接更新,它是由系统自动维护的。

2.该列数据类型必须为数值型:int, smallint, tinyint, decimal or numeric with scale 0。

3.该列不能为 null。

4.不能在该列上设置缺省值。

5.递增量只能为整形(比如:1,2,-3)。不能为小数,也不能为0。

6.基值(种子值 seed)可以由用户设置,缺省值为1。

理解 @@IDENTITY

@@IDENTITY 返回最后一个插入 IDENTITY 的值,这些操作包括:INSERT, SELECT INTO,或者 bulk copy。如果在给没有 IDENTITY 列的其他表插入记录,系统将其置为 null。如果有多行记录插入到 IDENTITY 表中,@@IDENTITY 表示最后一个产生的值。如果触发了某个触发器,并且这个触发器执行向另一个带有 IDENTITY 列的表的插入操作,@@IDENTITY 将返回这个由触发器产生的值。如果这个触发器插入的表中不包含 IDENTITY 列,那么 @@IDENTITY 将为 null。如果插入操作失败,@@IDENTITY 值依然会增加,所以 IDENTITY 不保证数据的连续性。

@@IDENTITY 是当前连接的全局变量,只对当前连接有效。也就是说,如果断开连接再重新连接后,@@IDENTITY 为 null。以 ADO 来说,@@IDENTITY 在 Connection 对象打开和关闭期间是有意义的,即在 Connection 对象的存在范围内有效。在 MTS 组件中,从打开连接到显式的关闭连接(Connection.Close)或者到调用了 SetAbort,SetComplete之前,在这期间,@@IDENTITY 有意义。

使用 Truncate table 语句会使 IDENTITY 列重新开始计算。

得到 @@IDENTITY 的值

有三种方法(以下代码均使用 VBScript)

方法一:

Dim Conn, strSQL, Rs
Set Conn = CreateObject("ADODB.Connection")
' Open a connection to the database
Conn.Open("DSN=myDSN;UID=myUID;PWD=myPWD;")

' Insert a new record into the table
strSQL = "INSERT INTO mtTable (columnName) VALUES ('something')"

' Execute the SQL statement
Conn.Execute(strSQL)

' Get the @@IDENTITY.
strSQL = "SELECT @@IDENTITY AS NewID"
Set Rs = Conn.Execute(lsSQL)
NewID = Rs.Fields("NewID").value

' Close the connection
Conn.Close()
Set Conn = Nothing

方法二(仅限于 ADO 2.0 以上):

Dim Conn, strSQL, Rs
Set Conn = CreateObject("ADODB.Connection")
' Open a connection to the database
Conn.Open("DSN=myDSN;UID=myUID;PWD=myPWD;")

' Insert a new record into the table
lsSQL = "INSERT INTO myTable (columnName) VALUES ('something');" &_
"SELECT @@IDENTITY AS NewID;"

' Execute the SQL statement
Set Rs = Conn.Execute(lsSQL)

' Get the second resultset into a RecordSet object
Set Rs = Rs.NextRecordSet()

' Get the inserted ID
NewID = Rs.Fields("NewID").value

' Close the connection
Conn.Close()
Set Conn = Nothing

方法三:

Dim Conn, strSQL, Rs
Set Conn = CreateObject("ADODB.Connection")
' Open a connection to the database
Conn.Open("DSN=myDSN;UID=myUID;PWD=myPWD;")

' Insert a new record into the table
strSQL = "SET NOCOUNT ON;" &_
"INSERT INTO myTable (columnName) VALUES ('something');" &_
"SELECT @@IDENTITY AS NewID;"

' Execute the SQL statement
Set Rs = Conn.Execute(lsSQL)

' Get the inserted ID
NewID = Rs.Fields("NewID").value

' Close the connection
Conn.Close()
Set Conn = Nothing

原文见http://www.coolbel.com/ace/articles/45.asp



yiwei 2000-07-28
  • 打赏
  • 举报
回复
CREATE CLUSTERED INDEX IndexName ON TableName(FieldName)
strangecat 2000-07-28
  • 打赏
  • 举报
回复
Alexela:老兄用TimeStamp类型做ID的方法很聪明,不过细想一下,TimeStamp精确到Second,如果同一秒内加入多个记录,就不保险了.
另外请教,建立唯一索引的SQL语句应该怎么写?谢谢
strangecat 2000-07-28
  • 打赏
  • 举报
回复
Wolfop所言极是.我的数据库现在建立在Access上,现使用Visual C++ + ODBC写程序.鉴于ODBC的通用性,希望以后数据库可在SQL-Server上.
另外请教TopHead,想将某字段设成自动增加的类型.此SQL语句应该怎么写?

谢谢
alexela 2000-07-28
  • 打赏
  • 举报
回复
1:用IDENTITY字段不能保证你的行是唯一的,除非你在该字段上建立唯一索引
2:用触发器也可实现唯一标识,但与上面相反,所触发的字段却不能索引,否则失效
3:最完美的解决方法:TIMESTAMP类型定义的列,每次更新或增加时,该列值发生变化,绝对唯一(整个库中唯一)!(但注意,若你的表可共享,别人与你同时修改同一条记录,在你之前先寄送,那此列的TIMESTAMP就改变,也就是说,你寄送时会出错——该记录已非彼记录——因为TIMESTAMP值变了)。并且还应该注意,每个表只能有一个TIMESTAMP字段
4:上述均为SQL SERVER 平台
祝你好运
TopHead 2000-07-28
  • 打赏
  • 举报
回复
在Sql Server中可以将字段设成自动增加的类型,这样每个记录都有唯一的ID号,并且新加入的纪录有一个新的ID号。
wolfop 2000-07-28
  • 打赏
  • 举报
回复
你用的什么数据库没有说清楚, 谁知道该如何实现, 在Oracle中可以用序列.
而好多别的数据库可以设定字段为自动增加的字段
wwwunix 2000-07-28
  • 打赏
  • 举报
回复
在Informix中:select max(rowid)+1 from tablename.每行记录都有一个唯一的rowid号,是隐藏的。其它数据库就不太清楚。
LaoZheng 2000-07-28
  • 打赏
  • 举报
回复
定一字段为 ID int IDENTITY (1,1)
自动得到一个新的唯一的ID号

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧