利用数据库触发器让字段与自增长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

@陈卧龙的博客

原文地址:https://www.cnblogs.com/chenwolong/p/8960918.html

时间: 2024-11-10 01:17:29

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

【赵强老师】利用数据库触发器实现数据的同步

一.什么是触发器 数据库触发器是一个与表相关联的,存储的PL/SQL 语句.每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列. 触发器的应用场景如下: 复杂的安全性检查 数据的确认 数据库审计 数据的备份和审计 二.创建Oracle触发器的语法 CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE

关于MySql中自增长id设置初始值

在MySQL数据库,设置了id为自增长类型,但由于程序还处于开发阶段,很容易的会产生错误数据,然后就直接删除了,可是id的自增长值没有跟着减少,这里提示: 如果表中数据没有用,直接删除了数据,自动增长ID还是不会从1开始的. 那么需要怎么做呢?有两种办法: 1.ALTER TABLE `tablename` auto_increment='22723' ;执行成功,继续插入就从22723开始了:) 2.可以利用“清空数据表”.这样自动增长ID就会从1开始.

数据库表及字段的命名等等相关规则

对象命名应该遵循的规则 1.可读性原则 使用大写和小写来格式化的库对象名字以获得良好的可读性(注意有些DBMS系统对表名大小写敏感) 2.表意性原则 对象的名字应该能描述它所标识的对象 3.长名原则 尽可能少使用或者不使用缩写,适用于数据库database名之外的任一对象 字段类型的选择原则 列的数据类型: 会影响数据存储空间的开销,影响数据库的查询功能 (优先:数字类型-->日期或二进制类型-->字符类型     相同级别则选择占用空间小的数据类型) 以上原则主要是从两个方面考虑: 1.对数

数据库表、字段命名规范

一.数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔,一个项目一个数据库,多个项目慎用同一个数据库 二.数据库表命名规范 2.1数据表命名规范 (1)采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔 (2)全部小写命名,禁止出现大写 (3)禁止使用数据库关键字,如:name,time ,datetime,password等 (4)

数据库触发器详讲

一:触发器的概念: 数据库触发器是一个与表相关联的,存储的plsql语句. 作用:每当一个特定的数据操作语句,(insert,update,delete)在指定的表发出时,Oracle自动地执行触发器中定义的语句序列 第一个触发器:每当成功插入新员工后   自动打印“插入新员工成功” create trigger 触发器名字(saynewemp) after (执行操作之后) insert on 操作的表(emp) declare begin dbms_output.put_line('成功插入

C#获取数据库中某个字段的最大值

curTime = SalesDB.ImageTable.Max(s => s.AddTime); 上面的代码获取到数据库中AddTime字段的最大值.

mybatis 插入实体与数据库中的字段不一致的解决方案

1.建立一个实体类 public class Student { private Integer id; private String name; private Double salary; public Student() { } public Student(Integer id, String name, Double salary) { this.id = id; this.name = name; this.salary = salary; } public Integer getI

数据库的OLE字段写入长二进制文件

//'*************************************************************************************** //'函数:将数据库的OLE字段写入长二进制文件 //'*************************************************************************************** //bool THsPart_clsPartCommonDB::PrintFieldT

基于SQL脚本将数据库表及字段提取为C#中的类

开发时,勉不了需要使用SQL直接与数据库交互,这时对于数据库中的表名及字段名会使用的比较多.如果每使用一次都复制一个,实在蛋疼. 所以就考虑将其做成const常量.但是数据库中的表和字段相当多,一个一个敲,不但累,还有可能敲错.要保证正确,最好的办法当然是使用工具或者脚本. 这里提供一个SQL脚本的实现. 原理:获取数据库的表--->遍历每个表中的字段--->生成数据 SQL代码 DECLARE @tableName VARCHAR(MAX) DECLARE @tableCount int D