none
为什么设置成identity列的值不连续 RRS feed

  • 问题

  • 在SQL Server 2008中,有一个表的某列已经设置成identity(30000,1),在Management Studio中,插入接近700条记录,都是能够自动增1,在VB.net 2005程序中,使用如果不存在则添加记录的操作,可是,插入的数据不连续,不知道为什么?

    程序很简单:

                ''-------------------------------------check exists, if item doesn't exist, add it first, this verion only use Facility Code to check exists
                If goApp.Connection.GetValue("select count(*) from Facility_T f where f.Provider_ID_INT = " & intProviderID & " and f.Facility_Code_VC = " & FormatData(strFacilityCode)) = 0 Then
                    strSQL = "insert into Facility_T( Facility_Name_VC, Provider_ID_INT, Facility_Code_VC ) values (" & FormatData(strFacilityName) & "," & intProviderID & "," & FormatData(strFacilityCode) & ");"
                    goApp.Connection.ExecuteSQL(strSQL)
                End If

    表结构:

    create table Facility_T (
      Facility_ID_INT int identity(30000,1) primary key
    , Facility_Code_VC nvarchar(20)
    , Facility_Name_VC nvarchar(250) not null
    , Provider_ID_INT int not null...

    2012年8月2日 3:29

答案

  • 查到原因了,神奇的SQL Server。怪不得懒人才用SQL Server,勤快的都去用Oracle去了。

    直接删除数据库,再创建,就极有可能会出这样的问题,要想不出这样的问题,最好是在Management Studio删除数据库后,关掉Management Studio,所有连接全部关闭。再开,再创建数据库才不会出错。特别有连接时,删除时会提示,找不到这个对象,不管,再创建,那出现这个问题的机率极大。

    • 已标记为答案 Johnbean 2012年8月8日 12:53
    2012年8月8日 12:53

全部回复

  • 应该是可以的……你的程序运行结果是?


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月2日 6:26
    版主
  • 你的程序运行结果是?

    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年8月3日 9:39
    版主
  • Facility_ID_INT Facility_Code_VC Facility_Name_VC
    30665 WAPIH Pilgrim
    30666 WARIH Riverslea
    30667 WASTH WA St Davids
    30668 WATRH Trinity
    30669 WATBH Tranby
    30672 LOU1NH Lourdes
    30673 ACWAH Warnervale
    30680 ARDMNH Ardmillian
    30697 CHAHNH Charles Harrison Memorial Home
    30749 BLUEH Blue Hills Village
    30753 BWLENH BW Legacy Wyoming

    这是我插入的部分结果,30665~30669是从Managemen Studio用SQL script添加的,之后,用VB.net编的程序直接加,就直接跳到30672,然后...,中间没有删除任何记录。

    已经按Facility_ID排序,就是发现不连续,所以才发贴问。

    类似的程序:

                '-------------------------------------check exists, if item doesn't exist, add it first
                If goApp.Connection.GetRecordCount("Provider_T", " and Provider_Code_VC = " & FormatData(strProvider)) = 0 Then
                    strSQL = "insert into Provider_T(Provider_Code_VC, Provider_Name_VC) values (" & FormatData(strProvider) & "," & FormatData(strProvider) & ")"
                    goApp.Connection.ExecuteSQL(strSQL)
                    'txtFile.Text = txtFile.Text & "Provider " & strProvider & " doesn't exists, need to insert to database" & vbCrLf
                End If

    表结构:

    ---------------------create provider table
    create table Provider_T (
      Provider_ID_INT int identity(10000,1) primary key
    , Provider_Code_VC nvarchar(50)
    , Provider_Name_VC nvarchar(250) not null............

    却没有问题,能够自增1,值连续。

    其实程序很简单,先找provider,不存在则添加到provider_t中,然后,再根据facility code,找facility,不存在则添加到facility_t。

    没有触发器,很简单的一个程序,而且就是从VB端添加时会出现问题,从Management Studio端没这个问题。

    如果说是Provider_T和Facility_T都出问题就算了,Provider_T这个表,插入80多条都是连续的,Facility_T这个表,从刚开始插就几条几条的出问题。很奇怪的事。

    数据是从一个excel表读入的,真是好麻烦呀,现在的解决办法就是,先把SQL script写到一个文本文件,再插入。只是这样的方法,真是笨得可以。就是不知道为什么会出现这样的问题?!!!

    我用的是SQL Server 2008 R2,开发者版本。

    • 已编辑 Johnbean 2012年8月3日 9:47
    2012年8月3日 9:46
  • 既然如此,不如先尝试写一个存储过程做复杂的插入操作,然后直接用SqlCommand调用存储过程即可。

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月5日 9:43
    版主
  • 是否存在插入失败的情况,identity即使插入失败也会递增的.
    2012年8月5日 13:53
  • 的确是这样的

    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年8月6日 3:30
    版主
  • 查到原因了,神奇的SQL Server。怪不得懒人才用SQL Server,勤快的都去用Oracle去了。

    直接删除数据库,再创建,就极有可能会出这样的问题,要想不出这样的问题,最好是在Management Studio删除数据库后,关掉Management Studio,所有连接全部关闭。再开,再创建数据库才不会出错。特别有连接时,删除时会提示,找不到这个对象,不管,再创建,那出现这个问题的机率极大。

    • 已标记为答案 Johnbean 2012年8月8日 12:53
    2012年8月8日 12:53
  • 查到原因了,神奇的SQL Server。怪不得懒人才用SQL Server,勤快的都去用Oracle去了。

    直接删除数据库,再创建,就极有可能会出这样的问题,要想不出这样的问题,最好是在Management Studio删除数据库后,关掉Management Studio,所有连接全部关闭。再开,再创建数据库才不会出错。特别有连接时,删除时会提示,找不到这个对象,不管,再创建,那出现这个问题的机率极大。


    谢谢!如果真是这个问题。建议你直接到英文版本的http://connect.microsoft.com,去反映一下。:D       

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月9日 0:43
    版主
  • 查到原因了,神奇的SQL Server。怪不得懒人才用SQL Server,勤快的都去用Oracle去了。

    直接删除数据库,再创建,就极有可能会出这样的问题,要想不出这样的问题,最好是在Management Studio删除数据库后,关掉Management Studio,所有连接全部关闭。再开,再创建数据库才不会出错。特别有连接时,删除时会提示,找不到这个对象,不管,再创建,那出现这个问题的机率极大。


    谢谢!如果真是这个问题。建议你直接到英文版本的http://connect.microsoft.com,去反映一下。:D       

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    想伟大一下,去了你说的链接,没权限,不管了,反正知道什么原因就行了。

    这个问题很容易就重现了,因为,我一直在开发程序。因为要经常导入数据,导入不对,我又会删除数据库,添加provider和facility,经常会碰到。等交货时,注意自己的操作步骤就行。

    2012年8月9日 5:23