论坛数据统计           欢迎到【弱电论坛】来学习和讨论问题!

弱电工程项目管理软件 报价之星软件--智能弱电系统专业软件
★电工电气产品供求、电气展会、人才、电气技术文章、图库、电气技术论坛等相关内容,请跳转至【电气工程网】--- 可直接使用本站会员名和密码登陆!(首次使用需要激活账户)
标王 热搜: 网络监控  楼宇对讲  弱电  机房及机柜内部的理线方法  ar800-hn  CAD  门禁  综合布线  工资  面板 
 
当前位置: 首页 » 技术文章 » 电脑技术 » 数 据 库 » 正文

设定Access数据库自增长字段初始值

放大字体  缩小字体 发布日期:2008-02-02  来源:互联网  作者:manage  浏览次数:3861
核心提示:最近在做论坛数据转换程序。例如表src, 表dest都有一个id自增长字段,(都是access数据库,起始值1 ,步长1)表src中id,char两字段的值为 1、a2、b3、c6、d7、e9、f这样在将src中的记录插入表dest的时候会有麻烦,使得表dest中记录如下所示1、a2、b3、c4、d5、e6、f这

最近在做论坛数据转换程序。例如表src, 表dest都有一个id自增长字段,(都是access数据库,起始值1 ,步长1)
表src中id,char两字段的值为
1、a
2、b
3、c
6、d
7、e
9、f
这样在将src中的记录插入表dest的时候会有麻烦,使得表dest中记录如下所示
1、a
2、b
3、c
4、d
5、e
6、f
这样造成dest和其它关联表中的数据难以对应 。因此有必要在向表dest中插入记录时 设置其id字段的起始值,然后再进行插入操作,通过以下语句,你可以在建表的时候指定其起始值和步进值:

CREATE TABLE tblNewOrder2 (
  OrderId AUTOINCREMENT (1000, 10),
  ItemId LONG, Quantity LONG) 

 

你也可以用下面的语句修改下一个起始值和步进值:

ALTER TABLE tblOrder
  ALTER COLUMN OrderId COUNTER (2000, 50) 


要重新开始:
ALTER TABLE tableName
  ALTER COLUMN OrderId COUNTER (1, 1) 


在 VBE 界面里面用以下代码:
docmd.runsql "ALTER TABLE tableName ALTER COLUMN OrderId COUNTER (1, 1)"

这里要注意的是自动编号往往被用作标识记录的唯一性,但是 Jet 在用 DDL 语句更改自动编号的同时不会保证修改后的自动编号仍然保持唯一性,因此会出现标识号重复的现象。要避免这一现象最好把自动编号设定为主键、或者不可重复。

哈哈 看来我的问题可以解决了 ,虽然是很不起眼的东西 ,但是用到时候没有 就会很抓狂 ^_^
程序虽然简单 但还是决定 明天把代码贴出来。


如何在已有数据的情况下更改某列的数据类型为“自动编号 递增”

问题:

如何在某字段已有数据的情况下更改该列的数据类型为“自动编号 递增”

 

回答:

ACCESS JET DB MDB 数据库中不允许将一个已经有值的字段的数据类型更改为“自动编号”类型,而且一个表只允许有一个自动编号字段。但是可以利用 JET DB MDB 数据库的一个特点,就是添加( INSERT INTO )记录时允许指定自动编号字段的值。具体内容请参考

    如何更改数据类型为“自动编号”“同步复制ID”的值?《查询》
    http://access911.net/index.asp?u1=a&u2=72FAB11E15DCE8F3

操作如下:

首先,必须确认该字段中每一条记录都已经赋值,而且不允许有重复,如果有重复,那么取一个不重复的值来代替。如果有空值,那么必须找一个新的不重复的值来更新该“空”。

其次,必须将该字段的数据类型转换为“数字-长整”,如果无法转换,那么一条一条去处理!

最后,新建立一个表(比如命名为:TEMP),其结构与需要更改字段类型的表(比如:tblName)的结构完全一致,当然,其中某个字段(比如:ID)已经是自动编号了。这时 TEMP 表没有任何记录,编程用 ADO 的 RECORDSET 循环整个 tblName 表,将所有数据一条一条 INSERT INTO 到 TEMP 表,然后删除 tblName 表,重命名 temp 为 tblName 即可


本文示例代码如下:


'按键盘 ALT + F11 转到  VBA 编辑器界面,菜单 插入 模块,然后将一下代码 COPY 进去
'点击鼠标左键,将光标停留在各个函数的名称上按 F5 可以执行该函数


'===========================================================
' 过程及函数名:  CreateTempDate
' 版本号      :  1.0
' 说明        :  本函数作用:建立本文章需要的测试环境(表)
' 引用        :  --
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  --
' 最后修改日期:  2006-9-14 16:32:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E11DCE8F3 
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
'===========================================================

Function CreateTempDate()
'本函数作用:建立本文章需要的测试环境(表)

    Dim strSQL(6) As String
    Dim i As Long
    strSQL(0) = "drop table tblName"
    strSQL(1) = "drop table temp"
    strSQL(2) = "create table tblName (ID LONG,Name text(50),Address text(50))"
    strSQL(3) = "insert into tblName(ID,NAME,ADDRESS) VALUES(1,'王午','上海')"
    strSQL(4) = "insert into tblName(ID,NAME,ADDRESS) VALUES(3,'立嗣','上海')"
    strSQL(5) = "insert into tblName(ID,NAME,ADDRESS) VALUES(45,'苏俄','上海')"
    strSQL(6) = "create table temp (ID AUTOINCREMENT(2,4),Name text(50),Address text(50),Primary KEY ([ID]))"
    
    On Error Resume Next
    For i = 0 To UBound(strSQL)
        CurrentProject.Connection.Execute strSQL(i)
        If Err <> 0 Then
            Debug.Print "语句 strSQL(" & CStr(i) & ") 运行出错:" & Err.Description
            Err.Clear
        End If
    Next
    
End Function



'===========================================================
' 过程及函数名:  DoAlterTable
' 版本号      :  1.0
' 说明        :  本函数作用:利用 JET DB 的特性更改已有数据字段的数据类型为“自动编号”“递增”
' 引用        :  --
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  --
' 最后修改日期:  2006-9-14 16:32:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E11DCE8F3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
'===========================================================

Function DoAlterTable()
'本函数作用:利用 JET DB 的特性更改已有数据字段的数据类型为“自动编号”“递增”
    Dim strSQL As String
    strSQL = "insert into temp (ID,NAME,ADDRESS) SELECT id,name,address from tblName"
    CurrentProject.Connection.Execute strSQL
    '如果是纯 ACCESS 环境可以使用
    'DoCmd.Rename "新表名", acTable, "原表名"
    '来更改表名

    renameTableName "tblName", "tblName-" & Format(Now, "yyyymmddhhnnss")
    renameTableName "temp", "tblName"
End Function



'===========================================================
' 过程及函数名:  renameTableName
' 版本号      :  1.0
' 说明        :  本函数作用,更改某个用户表的名称
' 引用        :  ADOX 
' 输入参数    :  strOldName 文本,修改前的名称
'                 strNewName 文本,修改后的表名称
' 输出值      :  --
' 返回值      :  Boolean 确定是否成功更名
' 调用演示    :  renameTableName "tblName", "tblName-" & Format(Now, "yyyymmddhhnnss")
' 最后修改日期:  2006-9-14 16:32:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E11DCE8F3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
'===========================================================

Function renameTableName(strOldName As String, strNewName As String) As Boolean
'本函数作用,更改某个用户表的名称

    On Error Resume Next
    'Dim tbl As ADOX.Table              '在 ACCESS 环境中可以这样声明
    'Dim cat As New ADOX.Catalog        '在 ACCESS 环境中可以这样声明
    Dim tbl
    Dim cat
    
    Set tbl = CreateObject("adox.table")
    Set cat = CreateObject("adox.catalog")
    Set cat.ActiveConnection = CurrentProject.Connection
    
    '上面这句中 CurrentProject.Connection 在VB中要更改为已经open的connection对象
    For Each tbl In cat.Tables
        If tbl.Name = strOldName Then tbl.Name = strNewName
    Next
    If Err.Number <> 0 Then
        renameTableName = False
    Else
        renameTableName = True
    End If
End Function


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

 
 
[ 技术文章搜索 ]  [ 加入收藏 ]  [ 告诉好友 ]  [ 打印本文 ]  [ 关闭窗口 ]

 
0条 [查看全部]  相关评论

 
推荐图文
推荐技术文章
点击排行
 
 



弱电网、电气网合并

 
弱电基础 | 常用软件 | 信息发布规则 | 积分规则 | VIP会员注册 | 广告投放 | 弱电培训 | 联系我们 | 版权声明 | 帮助中心 | 网站地图 | 排名推广 | 苏ICP备14010056号 | RSS订阅
★本站手机app客户端已上线! 点击下载