标识列(identity)的妙用
用户需求:
用户有这样一个表test
|
Ip |
Name |
|
127.3.2.0 |
Ken |
|
127.3.2.0 |
King |
|
127.3.2.0 |
Kent |
希望通过SQL语句实现更新表test中现有行的ip列值,依次按照127.0.0.1、127.0.0.2依次类推,即最后一位依次递增。
问题分析:
我们首先通过临时表做个测试,测试一下代码并查看输出结果
1
--生成测试数据
2
create table tab(id varchar(5) , tt varchar(5))
3
4
insert into tab
5
select 'w','a'
6
union select 'r','b'
7
union select 'x','c'
8
union select 'a','d'
9
union select 'f','e'
10
11
select * from tab
12
/*
13
id tt
14
-------------------
15
a d
16
f e
17
r b
18
w a
19
x c
20
*/
21
22
--UPDATE
23
ALTER TABLE tab ADD index_c int IDENTITY(1,1)
24
UPDATE TAB SET id = index_c
25
ALTER TABLE tab DROP COLUMN index_c
26
27
28
select * from tab
29
/*
30
id tt
31
-------------------
32
1 d
33
2 e
34
3 b
35
4 a
36
5 c
37
*/
38
39
--删除测试数据
40
drop table tab
41
--生成测试数据 2
create table tab(id varchar(5) , tt varchar(5)) 3
4
insert into tab 5
select 'w','a' 6
union select 'r','b' 7
union select 'x','c' 8
union select 'a','d' 9
union select 'f','e' 10
11
select * from tab 12
/* 13
id tt 14
------------------- 15
a d 16
f e 17
r b 18
w a 19
x c 20
*/ 21
22
--UPDATE 23
ALTER TABLE tab ADD index_c int IDENTITY(1,1) 24
UPDATE TAB SET id = index_c 25
ALTER TABLE tab DROP COLUMN index_c 26
27
28
select * from tab 29
/* 30
id tt 31
------------------- 32
1 d 33
2 e 34
3 b 35
4 a 36
5 c 37
*/ 38
39
--删除测试数据 40
drop table tab 41

解决办法:
参考上例我们处理如下
Step1: ALTER TABLE test ADD index_c int IDENTITY(1,1)
Step2:
UPDATE test SET ip = '172.22.8.' + cast( index_c as varchar)
ALTER TABLE test DROP COLUMN index_c
select * from test
执行后结果如下:
|
Ip |
Name |
|
127.0.0.1 |
Ken |
|
127.0.0.2 |
King |
|
127.0.0.3 |
Kent |
思想指导实践,实践加以应用,应用创造价值

浙公网安备 33010602011771号