想把下面图片里的bk_id里的数值都加29086要怎么做啊?我写的下面的执行会出错大神们帮忙看看
消息 8102,级别 16,状态 1,第 1 行
无法更新标识列 'bk_id'。update tb_info set bk_id=bk_id+'29086' where bk_id=bk_id

解决方案 »

  1.   

    bk_id是主键不能更新,如果非得更新,先把主键属性去掉,然后再更新,然后再改回主键,另外where条件不用加
      

  2.   

    无法更新标识列 'bk_id'。
    --------------------------- 错误提示很清楚了,可以考虑把数据满足条件数据删除,然后再重新 insert 进去,insert 的时候指定 id 为你要的值
      

  3.   

    这一列每行的值都不一样,重新insert怎么弄啊?小白一枚
      

  4.   

    USE tempdb
    GO
    IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
    IF OBJECT_ID('t_tmp') IS NOT NULL DROP TABLE t_tmp
    IF OBJECT_ID('t_bak_20180815') IS NOT NULL DROP TABLE t_bak_20180815
    GO
    CREATE TABLE t(
    bk_id INT IDENTITY(1,1) PRIMARY KEY,
    n NVARCHAR(10)
    )
    GO
    INSERT INTO t(n) VALUES ('abc');
    GO
    /*
    UPDATE t SET bk_id = bk_id+20986
    无法更新标识列 'bk_id'。
    */
    ----------- 以上为测试表及测试数据 ----------GO
    --1. 创建临时表
    CREATE TABLE t_tmp(
    bk_id INT IDENTITY(1,1) PRIMARY KEY,
    n NVARCHAR(10)
    )
    GO
    --2. 插入中转表
    SET IDENTITY_INSERT t_tmp ON
    INSERT INTO t_tmp(bk_id,n)
    SELECT bk_id+0 AS bk_id,n FROM t
    SET IDENTITY_INSERT t_tmp OFF
    GO
    --3. 两表换名
    EXEC sp_rename 't','t_bak_20180815'
    EXEC sp_rename 't_tmp','t'
    GO
    SELECT * FROM t;
    /*
    bk_id n
    1 abc
    */
    关键在于标识列, 这个没办法修改, 只能创建新表, 插入后再换表名。
      

  5.   

    USE [蒙文]
    GO/****** Object:  Table [dbo].[tb_info]    Script Date: 2018/8/15 16:10:32 ******/
    SET ANSI_NULLS ON
    GOSET QUOTED_IDENTIFIER ON
    GOCREATE TABLE [dbo].[tb_info](
    [bk_id] [int] IDENTITY(1,1) NOT NULL,
    [bk_isbn] [nvarchar](50) NULL,
    [bk_ean13] [nvarchar](50) NULL,
    [bk_name] [nvarchar](100) NULL,
    [bk_subname] [nvarchar](100) NULL,
    [bk_keyname] [nvarchar](200) NULL,
    [bk_auth] [nvarchar](100) NULL,
    [bk_class] [nvarchar](50) NULL,
    [bk_kind] [nvarchar](100) NULL,
    [prs_nme] [nvarchar](100) NULL,
    [pub_plc] [nvarchar](100) NULL,
    [pub_tme] [nvarchar](50) NULL,
    [page_ct] [nvarchar](20) NULL,
    [bk_pric] [nvarchar](20) NULL,
    [bk_edit] [nvarchar](50) NULL,
    [bk_vol] [nvarchar](50) NULL,
    [bk_size] [nvarchar](50) NULL,
    [bk_share] [nvarchar](100) NULL,
    [bk_print] [nvarchar](20) NULL,
    [bk_lang] [nvarchar](20) NULL,
    [bk_seri] [nvarchar](150) NULL,
    [bk_oth] [ntext] NULL,
    [bk_py] [nchar](100) NULL,
    [ipt_tme] [datetime] NULL,
    [bk_state] [int] NULL,
    [bk_type] [nvarchar](20) NULL,
    [bk_fz] [ntext] NULL,
    [bk_905] [ntext] NULL,
    [user_id] [nvarchar](50) NULL,
    [bk_pc] [nvarchar](50) NULL,
    [updatetimes] [int] NOT NULL,
    [bk_sysid] [int] NULL,
    [getdatatimes] [int] NULL,
    [lb_suit] [bit] NULL,
    [exp1] [nvarchar](100) NULL,
    [exp2] [nvarchar](100) NULL,
    [exp3] [nvarchar](100) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOALTER TABLE [dbo].[tb_info] ADD  CONSTRAINT [DF_tb_book_updatetimes]  DEFAULT (0) FOR [updatetimes]
    GOALTER TABLE [dbo].[tb_info] ADD  CONSTRAINT [DF_tb_info_getdatatimes]  DEFAULT (0) FOR [getdatatimes]
    GO
      

  6.   

    --1. 如果有同名表删除
    IF OBJECT_ID('[dbo].[tb_info_tmp]') IS NOT NULL DROP TABLE [dbo].[tb_info_tmp]
    IF OBJECT_ID('[dbo].[tb_info_bak_20180815]') IS NOT NULL DROP TABLE [dbo].tb_info_bak_20180815
    GO
    --2. 创建中转表 及 约束
    CREATE TABLE [dbo].[tb_info_tmp](
    [bk_id] [int] IDENTITY(1,1) NOT NULL,
    [bk_isbn] [nvarchar](50) NULL,
    [bk_ean13] [nvarchar](50) NULL,
    [bk_name] [nvarchar](100) NULL,
    [bk_subname] [nvarchar](100) NULL,
    [bk_keyname] [nvarchar](200) NULL,
    [bk_auth] [nvarchar](100) NULL,
    [bk_class] [nvarchar](50) NULL,
    [bk_kind] [nvarchar](100) NULL,
    [prs_nme] [nvarchar](100) NULL,
    [pub_plc] [nvarchar](100) NULL,
    [pub_tme] [nvarchar](50) NULL,
    [page_ct] [nvarchar](20) NULL,
    [bk_pric] [nvarchar](20) NULL,
    [bk_edit] [nvarchar](50) NULL,
    [bk_vol] [nvarchar](50) NULL,
    [bk_size] [nvarchar](50) NULL,
    [bk_share] [nvarchar](100) NULL,
    [bk_print] [nvarchar](20) NULL,
    [bk_lang] [nvarchar](20) NULL,
    [bk_seri] [nvarchar](150) NULL,
    [bk_oth] [ntext] NULL,
    [bk_py] [nchar](100) NULL,
    [ipt_tme] [datetime] NULL,
    [bk_state] [int] NULL,
    [bk_type] [nvarchar](20) NULL,
    [bk_fz] [ntext] NULL,
    [bk_905] [ntext] NULL,
    [user_id] [nvarchar](50) NULL,
    [bk_pc] [nvarchar](50) NULL,
    [updatetimes] [int] NOT NULL,
    [bk_sysid] [int] NULL,
    [getdatatimes] [int] NULL,
    [lb_suit] [bit] NULL,
    [exp1] [nvarchar](100) NULL,
    [exp2] [nvarchar](100) NULL,
    [exp3] [nvarchar](100) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[tb_info_tmp] ADD  CONSTRAINT [DF_tb_book_updatetimes1]  DEFAULT (0) FOR [updatetimes]
    GO
    ALTER TABLE [dbo].[tb_info_tmp] ADD  CONSTRAINT [DF_tb_info_getdatatimes1]  DEFAULT (0) FOR [getdatatimes]
    GO
    --帮你加主键,主键一般都是必须的
    ALTER TABLE [dbo].[tb_info_tmp] ADD CONSTRAINT PK_tb_info_1 PRIMARY KEY CLUSTERED([bk_id])
    GO
    --3. 将源表数据插入到中转表
    SET IDENTITY_INSERT [dbo].[tb_info_tmp] ON
    INSERT INTO [dbo].[tb_info_tmp]
               ([bk_id]
               ,[bk_isbn]
               ,[bk_ean13]
               ,[bk_name]
               ,[bk_subname]
               ,[bk_keyname]
               ,[bk_auth]
               ,[bk_class]
               ,[bk_kind]
               ,[prs_nme]
               ,[pub_plc]
               ,[pub_tme]
               ,[page_ct]
               ,[bk_pric]
               ,[bk_edit]
               ,[bk_vol]
               ,[bk_size]
               ,[bk_share]
               ,[bk_print]
               ,[bk_lang]
               ,[bk_seri]
               ,[bk_oth]
               ,[bk_py]
               ,[ipt_tme]
               ,[bk_state]
               ,[bk_type]
               ,[bk_fz]
               ,[bk_905]
               ,[user_id]
               ,[bk_pc]
               ,[updatetimes]
               ,[bk_sysid]
               ,[getdatatimes]
               ,[lb_suit]
               ,[exp1]
               ,[exp2]
               ,[exp3])
    SELECT [bk_id]
               ,[bk_isbn]
               ,[bk_ean13]
               ,[bk_name]
               ,[bk_subname]
               ,[bk_keyname]
               ,[bk_auth]
               ,[bk_class]
               ,[bk_kind]
               ,[prs_nme]
               ,[pub_plc]
               ,[pub_tme]
               ,[page_ct]
               ,[bk_pric]
               ,[bk_edit]
               ,[bk_vol]
               ,[bk_size]
               ,[bk_share]
               ,[bk_print]
               ,[bk_lang]
               ,[bk_seri]
               ,[bk_oth]
               ,[bk_py]
               ,[ipt_tme]
               ,[bk_state]
               ,[bk_type]
               ,[bk_fz]
               ,[bk_905]
               ,[user_id]
               ,[bk_pc]
               ,[updatetimes]
               ,[bk_sysid]
               ,[getdatatimes]
               ,[lb_suit]
               ,[exp1]
               ,[exp2]
               ,[exp3]
    FROM tb_info
    SET IDENTITY_INSERT [dbo].[tb_info_tmp] OFF
    --4. 互换表名
    EXEC sp_rename 'tb_info','tb_info_bak_20180815'
    EXEC sp_rename 'tb_info_tmp','tb_info'
      

  7.   

    这一列每行的值都不一样,重新insert怎么弄啊?小白一枚
    为什么有这个需求,一般来说主键都不会随意更新的,这个主键也可能是其他表的外键,更改主键可能会造成很多问题
      

  8.   

    这一列每行的值都不一样,重新insert怎么弄啊?小白一枚
    为什么有这个需求,一般来说主键都不会随意更新的,这个主键也可能是其他表的外键,更改主键可能会造成很多问题
    因为是想把a数据库的这个表附加到B数据库上,但是bk_id这个值要改一下才不重复。
      

  9.   

    非常感谢!写了这么多!执行完这个还怎么弄啊我执行了一下成功了,但是bk_id的值没变呀
      

  10.   

    这一列每行的值都不一样,重新insert怎么弄啊?小白一枚
    为什么有这个需求,一般来说主键都不会随意更新的,这个主键也可能是其他表的外键,更改主键可能会造成很多问题
    因为是想把a数据库的这个表附加到B数据库上,但是bk_id这个值要改一下才不重复。
    直接插入数据不插入主键,B库表上的主键也会自动生成的
      

  11.   

    不好意思, 忘记 + 29086 了。你把下面的脚本再执行一次就好了:
    --1. 如果有同名表删除
    IF OBJECT_ID('[dbo].[tb_info_tmp]') IS NOT NULL DROP TABLE [dbo].[tb_info_tmp]
    IF OBJECT_ID('[dbo].[tb_info_bak_20180815]') IS NOT NULL DROP TABLE [dbo].tb_info_bak_20180815
    GO
    --2. 创建中转表 及 约束
    CREATE TABLE [dbo].[tb_info_tmp](
    [bk_id] [int] IDENTITY(1,1) NOT NULL,
    [bk_isbn] [nvarchar](50) NULL,
    [bk_ean13] [nvarchar](50) NULL,
    [bk_name] [nvarchar](100) NULL,
    [bk_subname] [nvarchar](100) NULL,
    [bk_keyname] [nvarchar](200) NULL,
    [bk_auth] [nvarchar](100) NULL,
    [bk_class] [nvarchar](50) NULL,
    [bk_kind] [nvarchar](100) NULL,
    [prs_nme] [nvarchar](100) NULL,
    [pub_plc] [nvarchar](100) NULL,
    [pub_tme] [nvarchar](50) NULL,
    [page_ct] [nvarchar](20) NULL,
    [bk_pric] [nvarchar](20) NULL,
    [bk_edit] [nvarchar](50) NULL,
    [bk_vol] [nvarchar](50) NULL,
    [bk_size] [nvarchar](50) NULL,
    [bk_share] [nvarchar](100) NULL,
    [bk_print] [nvarchar](20) NULL,
    [bk_lang] [nvarchar](20) NULL,
    [bk_seri] [nvarchar](150) NULL,
    [bk_oth] [ntext] NULL,
    [bk_py] [nchar](100) NULL,
    [ipt_tme] [datetime] NULL,
    [bk_state] [int] NULL,
    [bk_type] [nvarchar](20) NULL,
    [bk_fz] [ntext] NULL,
    [bk_905] [ntext] NULL,
    [user_id] [nvarchar](50) NULL,
    [bk_pc] [nvarchar](50) NULL,
    [updatetimes] [int] NOT NULL,
    [bk_sysid] [int] NULL,
    [getdatatimes] [int] NULL,
    [lb_suit] [bit] NULL,
    [exp1] [nvarchar](100) NULL,
    [exp2] [nvarchar](100) NULL,
    [exp3] [nvarchar](100) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[tb_info_tmp] ADD  CONSTRAINT [DF_tb_book_updatetimes2]  DEFAULT (0) FOR [updatetimes]
    GO
    ALTER TABLE [dbo].[tb_info_tmp] ADD  CONSTRAINT [DF_tb_info_getdatatimes2]  DEFAULT (0) FOR [getdatatimes]
    GO
    --帮你加主键,主键一般都是必须的
    ALTER TABLE [dbo].[tb_info_tmp] ADD CONSTRAINT PK_tb_info_2 PRIMARY KEY CLUSTERED([bk_id])
    GO
    --3. 将源表数据插入到中转表
    SET IDENTITY_INSERT [dbo].[tb_info_tmp] ON
    INSERT INTO [dbo].[tb_info_tmp]
               ([bk_id]
               ,[bk_isbn]
               ,[bk_ean13]
               ,[bk_name]
               ,[bk_subname]
               ,[bk_keyname]
               ,[bk_auth]
               ,[bk_class]
               ,[bk_kind]
               ,[prs_nme]
               ,[pub_plc]
               ,[pub_tme]
               ,[page_ct]
               ,[bk_pric]
               ,[bk_edit]
               ,[bk_vol]
               ,[bk_size]
               ,[bk_share]
               ,[bk_print]
               ,[bk_lang]
               ,[bk_seri]
               ,[bk_oth]
               ,[bk_py]
               ,[ipt_tme]
               ,[bk_state]
               ,[bk_type]
               ,[bk_fz]
               ,[bk_905]
               ,[user_id]
               ,[bk_pc]
               ,[updatetimes]
               ,[bk_sysid]
               ,[getdatatimes]
               ,[lb_suit]
               ,[exp1]
               ,[exp2]
               ,[exp3])
    SELECT [bk_id]+29086
               ,[bk_isbn]
               ,[bk_ean13]
               ,[bk_name]
               ,[bk_subname]
               ,[bk_keyname]
               ,[bk_auth]
               ,[bk_class]
               ,[bk_kind]
               ,[prs_nme]
               ,[pub_plc]
               ,[pub_tme]
               ,[page_ct]
               ,[bk_pric]
               ,[bk_edit]
               ,[bk_vol]
               ,[bk_size]
               ,[bk_share]
               ,[bk_print]
               ,[bk_lang]
               ,[bk_seri]
               ,[bk_oth]
               ,[bk_py]
               ,[ipt_tme]
               ,[bk_state]
               ,[bk_type]
               ,[bk_fz]
               ,[bk_905]
               ,[user_id]
               ,[bk_pc]
               ,[updatetimes]
               ,[bk_sysid]
               ,[getdatatimes]
               ,[lb_suit]
               ,[exp1]
               ,[exp2]
               ,[exp3]
    FROM tb_info
    SET IDENTITY_INSERT [dbo].[tb_info_tmp] OFF
    --4. 互换表名
    EXEC sp_rename 'tb_info','tb_info_bak_20180815_2'
    EXEC sp_rename 'tb_info_tmp','tb_info'