awaken the dawn钢琴谱:怎样更新一个已有数据SQL表的主键,自动填充部分编码~

来源:百度文库 编辑:高考问答 时间:2024/05/05 07:50:17
请教一个问题,如果要更新一个已有数据的SQL表的主键,能否实现前一部分数据指定(提取表的某个字段做前一部分的编码),后一部分编码自动累加?如果能,具体怎样实现呢?谢谢!

比如这样

【ptype】 表
typeID --为ptype 表主键(10-15位数字)
ParID --类编号(5-10位数字)
要取 ParID 作为Ptype 字段编码的前5-10位,后5位自动生成序列,更新原有不规则的编码。
-----------------------------------------------------------
编码的结构是这样的 typeID 为ParID编码+5位,每5位为一层编码
typeID ParID
000020000100025 0000200001
000050000300012 0000500003
0000600001 00006
0000600105 00006
00002000010002500003 0000200001 --也有这样不规则的
000060010500235 00006 --也有这样不规则的
-----------------------------------------------------------
如何能让 typeId 的编码更新成前把半部分为同行内的ParID,后面不规则的编码更新成顺序的规则的编码?
如果无法实现,生成一个临时表也行~再更新回来也行~
能不能再加上条件呢?比如 ParID 大于5位的才执行更新 ,否则保留原有 tpyeID。或者 ParID =''才执行更新,否则保留原有 tpyeID。

joinzhou 给的语句在执行后出现了这样的错误,
表中出现了 正常的15位编码 023810000200002
同时还有很多不正常的16位编码 0238100002100002 这样就也无法纠正,去掉那个多余的1后,会出现重码,我只好又还原备份了。
还有 ParID 大于5位的才执行更新,否则保留原有 tpyeID 就可以。更新ParID 是5位的反而更新错了。或者说是 ParID='00000'的,它的typeID也是5位编码,不是10位。

假设你的数据库是MSSQL SERVER,那么使用一个临时表和游标操作
可以满足你要求功能,SQL 语句序列如下:

====================================================
set nocount on

exec sp_addmessage 60000,16,'%05d','us_english',@replace ='replace'

select distinct ParID,0 AS C INTO TMP from table_name

DECLARE @ParID varchar(20),@C int

DECLARE cursor_name CURSOR
FOR SELECT ParID FROM table_name
FOR UPDATE OF TypeID
OPEN cursor_name

FETCH NEXT FROM cursor_name INTO @ParID
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE TMP SET C=C+1 WHERE ParID=@ParID
SELECT @C=C FROM TMP WHERE ParID=@ParID

UPDATE table_name SET TypeID=@ParID+formatmessage(60000,@C)
WHERE CURRENT OF cursor_name

FETCH NEXT FROM cursor_name INTO @ParID
END

CLOSE cursor_name
DEALLOCATE cursor_name

exec sp_dropmessage 60000,'us_english'
drop table tmp

=======================================================

上述脚本的使用方法:

准备:将“你的表”做个备份,最好是将你的数据库做个备份

1、将上述脚本拷贝到 SQL 查询分析器中
2、将其中字符串“table_name”替换为“你的表的名称”
3、执行即可

注意事项:

如果你的表中记录很多,执行时间可能比较长;

============================================================

祝你好运!

你自己数据处理一下就可以了

首先建一个表ptype1

表的结构和ptype一样,加一个字段 fID 设置为int 并且为标识(自动加1)

然后在ptype1表里面加一个触发器,

CREATE TRIGGER trg_ptype1_I ON dbo.ptype1
AFTER INSERT
AS

Declare @ParID nvarchar(250), @fid int

Select @fid = fid, @ParID= ParID From inserted
update dbo.ptype1 set typeID = (@ParID + @fid ) where fid = @fid

然后再sql分析器里面把 ptype 的数据导到ptype1 ,然后删除ptype ,把ptype1改为ptype 就可以了

用vc行不?

如果主键还有从键呢
最好去下一个专业软件