我建立了这样一张表 有三个字段 其中id是序号是根据我写入数据的顺序排列的
id name result
0 张三 78
1 李四 72
2 王五 82
3 孙六 91 我想实现:在我删除行 2 王五 82 之后
行3 孙六 91自动递补上去 这张表即是:
id name result
0 张三 78
1 李四 72
2 孙六 91 怎么实现呢?
id name result
0 张三 78
1 李四 72
2 王五 82
3 孙六 91 我想实现:在我删除行 2 王五 82 之后
行3 孙六 91自动递补上去 这张表即是:
id name result
0 张三 78
1 李四 72
2 孙六 91 怎么实现呢?
CREATE TABLE t1(ID int IDENTITY,A int)
GO
--插入记录
INSERT t1 VALUES(1)
GO--1. 将IDENTITY(标识)列变为普通列
ALTER TABLE t1 ADD ID_temp int
GOUPDATE t1 SET ID_temp=ID
ALTER TABLE t1 DROP COLUMN ID
EXEC sp_rename N't1.ID_temp',N'ID',N'COLUMN'
INSERT t1 VALUES(100,9)
GO--2. 将普通列变为标识列
CREATE TABLE t1_temp(ID int,A int IDENTITY)
SET IDENTITY_INSERT t1_temp ON
INSERT t1_temp(ID,A) SELECT * FROM t1
SET IDENTITY_INSERT t1_temp OFF
DROP TABLE T1
GOEXEC sp_rename N't1_temp',N't1'
INSERT t1 VALUES(109999)
GO--显示处理结果
SELECT * FROM t1
/*--结果:
ID A
----------------- -----------
1 1
100 9
109999 10
--*/
如果這樣沒有必要
查詢的時候生成就好了
2000
select ID=(select count(*) from tb where ID<=t.ID),
name,
result
from tb t
2005
select ID=row_number()over(order by (select 1)),
name,
result
from tb
UPDATE TB SET ID=(
SELECT COUNT(1) FROM TB T2 WHERE T2.ID<ID
)
insert into #temp (name,result)
select name ,result
from 你的表
order by id
楼主的这种需求很不好。
如果仅仅是为为了查询:wufeng4552的方案很好
如果必须得在表里实现,你想啊:数据量大、并发多了 后 无论何种处理(fredrickhu的重新生成表、或者利用触发器实现等)都会引起锁问题,且性能很差!
GO
IF OBJECT_ID('dbo.T1') IS NOT NULL
DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1
(
keycol INT NOT NULL PRIMARY KEY,
datacol VARCHAR(10) NOT NULL
);
GO
--创建Sequence表来保留最新的列值
IF OBJECT_ID('dbo.Sequence') IS NOT NULL
DROP TABLE dbo.Sequence;
GO
CREATE TABLE dbo.Sequence(val INT NOT NULL);
INSERT INTO dbo.Sequence VALUES(0);
GO
--建立触发器
CREATE TRIGGER trg_T1_ioi_assign_key ON dbo.T1 INSTEAD OF INSERT
AS
DECLARE @rc AS INT, @key AS INT;
SET @rc = @@rowcount;
--如果是0行 则返回
IF @rc = 0 RETURN;
--更新你的Sequence表 @key存储Sequence表的值,记住还要把Sequence表的值更新到最新的列值
UPDATE dbo.Sequence SET @key = val, val = val + @rc;
--插入T1表 更新的列值
INSERT INTO dbo.T1(keycol, datacol)
SELECT @key + ROW_NUMBER() OVER(ORDER BY getdate()), datacol
FROM (SELECT datacol FROM inserted) AS I;
GO
--插入测试
INSERT INTO dbo.T1(datacol)
SELECT LastName FROM Northwind.dbo.Employees;
SELECT keycol, datacol FROM dbo.T1;
/*
keycol datacol
----------- ----------
1 Buchanan
2 Callahan
3 Davolio
4 Dodsworth
5 Fuller
6 King
7 Leverling
8 Peacock
9 Suyama*/
参考这个吧
如果你不想断号。。换其他方式替代IDENTITY
然后用触发器
如果只作定期维护,还是可以考虑
方法参照2楼,