去掉表的identity属性

在我们的业务中,我们经常碰到去掉表的identity属性的需求。但是sql并没有提供可以直接去掉该属性的sql语句。但是其实我们自己可以通过三种方式来实现。

第一种:通过界面操作

将以上图中的yes改为no ,然后点击保存,这里需要注意一个问题,sql server好像默认是不允许这样改,这里我们就需要修改一个选项

需要将以上红色框内的选项去掉,这样就可以保存修改,并且保存修改所使用的脚本。

第二种方式,其实就跟上面类似,只是我们可以按照它的原理通过脚本实现。

 1 use Test
 2 go
 3 if OBJECT_ID(‘dbo.RemoveIdentiyTest‘) is not null
 4    drop table dbo.RemoveIdentiyTest
 5 go
 6 --新建一个测试表
 7 create table dbo.RemoveIdentiyTest
 8 (
 9  id int identity not null,
10  col1 varchar(10) not null constraint DF_RemoveIdentiyTest_col1 default ‘aaa‘,
11  col2 varchar(10) null,
12  col3 int null,
13  col4 int null,
14  col5 char(10) null
15  constraint PK_RemoveIdentiyTest primary key clustered
16  (
17    id asc
18  )
19 ) ON [PRIMARY]
20 go
21 create nonclustered index IX_RemoveIdentiyTest_col3_col4 on dbo.RemoveIdentiyTest
22 (
23  col3,col4
24 )with(fillfactor=80) on [primary]
25 go
26 create  nonclustered index IX_RemoveIdentiyTest_col5 on dbo.RemoveIdentiyTest
27 (
28  col5
29 )with(fillfactor=80)on [primary]
30
31 --method 2:insert date into a tempoprary table
32 BEGIN TRANSACTION
33 GO
34 --为了保证临时表中的数据与原表保持一致,我们要在插入数据前给临时表加对应的默认值约束,但是同一个数据库不能建名称一样的约束,   --所以这里我们先删除原表的约束,这个操作并不影响现存表中的数据
35 ALTER TABLE dbo.RemoveIdentiyTest
36     DROP CONSTRAINT DF_RemoveIdentiyTest_col1
37 GO
38 --新建一个临时表
39 CREATE TABLE dbo.Tmp_RemoveIdentiyTest
40     (
41     id int NOT NULL,
42     col1 varchar(10) NOT NULL,
43     col2 varchar(10) NULL,
44     col3 int NULL,
45     col4 int NULL,
46     col5 char(10) NULL
47     )  ON [PRIMARY]
48 GO
49 --给临时表加锁
50 ALTER TABLE dbo.Tmp_RemoveIdentiyTest SET (LOCK_ESCALATION = TABLE)
51 GO
52 --为了保证临时表中的数据与原表保持一致,我们要在插入数据前给临时表加对应的默认值约束
53 ALTER TABLE dbo.Tmp_RemoveIdentiyTest ADD CONSTRAINT
54     DF_RemoveIdentiyTest_col1 DEFAULT (‘aaa‘) FOR col1
55 GO
56 --导数据
57 IF EXISTS(SELECT * FROM dbo.RemoveIdentiyTest)
58      EXEC(‘INSERT INTO dbo.Tmp_RemoveIdentiyTest (id, col1, col2, col3, col4, col5)
59         SELECT id, col1, col2, col3, col4, col5 FROM dbo.RemoveIdentiyTest WITH (HOLDLOCK TABLOCKX)‘)
60 GO
61 --删除原表
62 DROP TABLE dbo.RemoveIdentiyTest
63 GO
64 --将临时表更名为正式表
65 EXECUTE sp_rename N‘dbo.Tmp_RemoveIdentiyTest‘, N‘RemoveIdentiyTest‘, ‘OBJECT‘
66 GO
67 --添加相应的索引
68 ALTER TABLE dbo.RemoveIdentiyTest ADD CONSTRAINT
69     PK_RemoveIdentiyTest PRIMARY KEY CLUSTERED
70     (
71     id
72     ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
73
74 GO
75 CREATE NONCLUSTERED INDEX IX_RemoveIdentiyTest_col3_col4 ON dbo.RemoveIdentiyTest
76     (
77     col3,
78     col4
79     ) WITH( PAD_INDEX = OFF, FILLFACTOR = 80, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
80 GO
81 CREATE NONCLUSTERED INDEX IX_RemoveIdentiyTest_col5 ON dbo.RemoveIdentiyTest
82     (
83     col5
84     ) WITH( PAD_INDEX = OFF, FILLFACTOR = 80, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
85 GO
86 COMMIT

方法三:也是通过脚本实现,但是这里我们使用switch to的方式导数据(这是从分区表借鉴过来的),当然这个两个表switch to有一些限制条件,比如两个表有相同的表结构,两个表必须在同一个数据库等。

 1 use Test
 2 go
 3 if OBJECT_ID(‘dbo.RemoveIdentiyTest‘) is not null
 4    drop table dbo.RemoveIdentiyTest
 5 go
 6 --新建一个测试表
 7 create table dbo.RemoveIdentiyTest
 8 (
 9  id int identity not null,
10  col1 varchar(10) not null constraint DF_RemoveIdentiyTest_col1 default ‘aaa‘,
11  col2 varchar(10) null,
12  col3 int null,
13  col4 int null,
14  col5 char(10) null
15  constraint PK_RemoveIdentiyTest primary key clustered
16  (
17    id asc
18  )
19 ) ON [PRIMARY]
20 go
21 create nonclustered index IX_RemoveIdentiyTest_col3_col4 on dbo.RemoveIdentiyTest
22 (
23  col3,col4
24 )with(fillfactor=80) on [primary]
25 go
26 create  nonclustered index IX_RemoveIdentiyTest_col5 on dbo.RemoveIdentiyTest
27 (
28  col5
29 )with(fillfactor=80)on [primary]
30
31 go
32
33 --插入测试数据
34 declare @i  int,@a int,@b int
35 set @i=0
36 set @a=10000
37 set @b=0
38 while(@i<100000)
39     begin
40         insert into dbo.RemoveIdentiyTest
41         select ‘aa‘+cast(@i as varchar)+‘ff‘,‘bb‘+cast(@i as varchar)+‘dd‘,@a,@b,‘A‘+cast(@i as varchar)
42         set @i=@i+1;
43         set @a=@a-1;
44         set @b=@b+2;
45     end
46 go
47
48 begin try
49     begin transaction
50
51     alter table dbo.RemoveIdentiyTest drop constraint DF_RemoveIdentiyTest_col1
52     if OBJECT_ID(‘dbo.tmp_RemoveIdentiyTest‘) is not null
53          drop table dbo.tmp_RemoveIdentiyTest
54     create table dbo.tmp_RemoveIdentiyTest
55     (
56      id int  not null,
57      col1 varchar(10) not null,
58      col2 varchar(10) null,
59      col3 int null,
60      col4 int null,
61      col5 char(10) null
62      constraint PK_tmp_RemoveIdentiyTest primary key clustered
63      (
64        id asc
65      )
66     ) ON [PRIMARY]
67
68     create nonclustered index IX_tmp_RemoveIdentiyTest_col3_col4 on dbo.tmp_RemoveIdentiyTest
69     (
70      col3,col4
71     )with(fillfactor=80) on [primary]
72
73     create  nonclustered index IX_tmp_RemoveIdentiyTest_col5 on dbo.tmp_RemoveIdentiyTest
74     (
75      col5
76     )with(fillfactor=80)on [primary]
77      --这里使用switch to的方式,比insert 导数据的效率要高很多
78     alter table dbo.RemoveIdentiyTest SWITCH  to dbo.tmp_RemoveIdentiyTest
79     alter table dbo.tmp_RemoveIdentiyTest add constraint DF_RemoveIdentiyTest_col1  DEFAULT (‘aaa‘) FOR col1
80     drop table dbo.RemoveIdentiyTest
81     exec sp_rename  N‘Test.dbo.tmp_RemoveIdentiyTest.IX_tmp_RemoveIdentiyTest_col3_col4‘,N‘IX_RemoveIdentiyTest_col3_col4‘,N‘index‘
82     exec sp_rename  N‘Test.dbo.tmp_RemoveIdentiyTest.IX_tmp_RemoveIdentiyTest_col5‘,N‘IX_RemoveIdentiyTest_col5‘,N‘INDEX‘
83     exec sp_rename  N‘PK_tmp_RemoveIdentiyTest‘,N‘PK_RemoveIdentiyTest‘,N‘object‘
84     exec sp_rename ‘Tmp_RemoveIdentiyTest‘, ‘RemoveIdentiyTest‘,‘object‘
85    commit
86 end    try
87 begin catch
88     print ‘error‘
89     rollback tran
90 end catch

对于以上三种方式,我个人认为如果数据量不是很大,我们可以直接采用第一种或者第二种,但是如果数据量比较大,我们没有足够的磁盘空间或者修改该表所需时间紧迫的情况下,我们可以采用第三种方式。

去掉表的identity属性

时间: 2024-12-20 11:17:06

去掉表的identity属性的相关文章

T-SQL开发 - 10.IDENTITY属性使用小结

从SQL Server 2012开始有了Sequence,简单用列如下: CREATE SEQUENCE TestSeq START WITH 1 INCREMENT BY 1; SELECT NEXT VALUE FOR TestSeq AS NextValue; 在这之前,表中生成序列号大多都是借助IDENTITY列属性,当然也有一些时候,是在自定义表中,自己维护序列号. 一. 创建IDENTITY列 if OBJECT_ID('test','U') is not null     drop

10. IDENTITY属性使用小结

从SQL Server 2012开始有了Sequence,简单用列如下: CREATE SEQUENCE TestSeq START WITH 1 INCREMENT BY 1 ; SELECT NEXT VALUE FOR TestSeq AS NextValue; 在这之前,表中生成序列号大多都是借助IDENTITY列属性,当然也有一些时候,是在自定义表中,自己维护序列号. 一. 创建IDENTITY列 if OBJECT_ID('test','U') is not null drop ta

小贝_mysql建表以及列属性

mysql建表以及列属性 简要: 一.建表原则 二.详细的列属性说明 一.建表原则 建表: 其实就是声明列的过程,数据最终是以文件的形式放在硬盘(内存) 列: 不同的列类型占的空间不一样. 选列的原则: 够用,不浪费 二.列类型以及属性说明 列类型有: 整形.浮点型.字符型.日期/时间型 2.1.整形 tinyint/smallint/mediumint/int/bigint 2.1.1.详解tinyint 一个字节 [][][][][][][][]共8位 假设8为都为0 ==> 转化为十进制

[ jquery 表单UI选择器和表单元素属性选择器 ] 表单UI选择器和表单元素属性选择器

表单UI选择器和表单元素属性选择器: 实例: <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title> <meta http-equiv='description' content='this is my page'> <meta http-equiv='keywords' content='keyword1,keyword2,keywo

表单的属性和方法, 获取表单和表单的元素, 验证表单

表单的属性和方法 一. 表单字段的属性(id/name/value/form),这里用value属性来举例 上面的form属性代表获取表单字段的父级表单对象 1. 属性的获取         console.log(document.myform.username.value); 2. 属性的设置            document.myform.username.value="123"; 3. 获取表单字段的父级表单对象 console.log(document.myform.u

border-radius 样式表CSS3圆角属性

border-radius 是CSS3圆角属性,用来实现DIV层的4个边框画成圆角. 一.语法: border-radius : none | <length>{1,4} [/ <length>{1,4} ] 如:border-radius:5px 5px 5px 5px; 二.取值: <length>: 由浮点数字和单位标识符组成的长度值.不可为负值. 三.说明: border- radius是一种缩写方法.如果"/"前后的值都存在,那么"

jquery】常用的jquery获取表单对象的属性与值

1 [jquery]常用的jquery获取表单对象的属性与值 2 3 4 1.JQuery的概念 5 6 7 8 9 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用一些简单的代码实现一些复杂的JS效果. 10 11 12 2.JQuery实现了 代码的分离 13 14 不用再网页中加入如:onclick之类的事件来调用函数了,直接引入JQuery类库和自己编写的JQuery代码就可以了: 15 如: 16 $(function(){ 17 $("Ele

struts之动态方法调用改变表单action属性

一.动态方法调用(DMI:Dynamic Method Invocation) ⒈struts2中同样提供了这个包含多个逻辑业处理的Action,这样就可以在一个Action中进行多个业务逻辑处理.例如:当用户通过不同的提交按钮来提交同一个表单的时候,系统通过不同的方法来处理用户不同的请求,这时候就需要让同一个Action中包含有多个控制处理的逻辑. ⒉动态方法调用有: ①.改变struts.xml中的action中的method属性. ②.改变form表单中的action属性来改变不同提交的请

django-创建表的字段属性,表关系

表的各种属性文档:null char ..., django与之对应的文档 https://docs.djangoproject.com/en/1.11/ref/models/fields/   英文 https://yiyibooks.cn/xx/Django_1.11.6/ref/models/fields.html     中文 表关系 class Book(models.Model): headline = models.CharField('大标题', max_length=50) p