利用数据库触发器让字段与自增长Id相关联

Posted 天才第一步,雀氏纸尿布

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用数据库触发器让字段与自增长Id相关联相关的知识,希望对你有一定的参考价值。

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

今天是数据库脚本类的代码,所以不想过多阐述

如下数据表:

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相关联的主要内容,如果未能解决你的问题,请参考以下文章

mongodb关联查询

Navicat for MySQL怎么将设置成外键的ID设置自动增长

FireBird 数据库 自动增长列怎么实现的?请高手

Rails - 如何让两个用户 ID 与模型相关联

我要关联查询两张表,但是相关联的字段的类型不一致,该怎么解决呢?两个数据库的字段如下:

SQL 表中如何让某条记录的某个属性值与另一个表中的某条记录的某个属性值相关联