1. 程式人生 > >利用數據庫觸發器讓字段與自增長Id相關聯

利用數據庫觸發器讓字段與自增長Id相關聯

過程 過多 調用 trigge ase cas varchar color http

十年河東,十年河西,莫欺少年窮

學無止境,精益求精

今天是數據庫腳本類的代碼,所以不想過多闡述

如下數據表:

create table Card(
Id int identity(1,1) primary key,
CardNo varchar(50) unique not null,
Status bit default(0)
)

上述表中有自增長字段Id,現在要求字段 CardNo 和自增長Id 相關聯,譬如,當Id為1時,CardNo 應該為 Card00001,當Id為15時,CardNo應該為: Card00015 ,要求通過觸發器或存儲過程實現?

其中觸發器實現如下:

create TRIGGER
[dbo].[TGR_Card] ON [dbo].[Card] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for trigger here、 DECLARE @Id bigint SELECT @Id = Id FROM INSERTED
UPDATE Card SET CardNo = CASE WHEN LEN(@Id) = 1 THEN Crad0000000 + CAST(@Id AS varchar(20)) WHEN LEN(@Id) = 2 THEN Crad000000 + CAST(@Id AS varchar(20)) WHEN LEN(@Id) = 3 THEN
Crad00000 + CAST(@Id AS varchar(20)) WHEN LEN(@Id) = 4 THEN Crad0000 + CAST(@Id AS varchar(20)) WHEN LEN(@Id) = 5 THEN Crad000 + CAST(@Id AS varchar(20)) WHEN LEN(@Id) = 6 THEN Crad00 + CAST(@Id AS varchar(20)) WHEN LEN(@Id) = 7 THEN Crad0 + CAST(@Id AS varchar(20)) WHEN LEN(@Id) = 8 THEN Crad + CAST(@Id AS varchar(20)) END WHERE orderId = @Id END

如果用存儲過程如何實現呢?

存儲過程實現就需要考慮如下因素了:

1、存儲過程需要程序調用執行

2、如果同一時刻多條數據插入數據庫時,就應該考慮到數據並發,因此,采用存儲過程實現應該避免並發

那麽,存儲過程應該怎麽實現呢?

我們都知道,防止並發我們采用樂觀鎖或悲觀鎖,在此不做演示了,總之,要加上版本字段 ,數據庫類型:TimeStamp!

關於並發的避免大家可參考:http://www.cnblogs.com/chenwolong/p/Lock.html

http://www.cnblogs.com/chenwolong/p/BF.html

@陳臥龍的博客

利用數據庫觸發器讓字段與自增長Id相關聯