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

学无止境,精益求精

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

如下数据表:

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相关联的更多相关文章

  1. ThinkPHP利用数据库字段做栏目的无限分类

    一直以来对cms后台的栏目管理不太理解,尤其是子栏目顶级栏目这种关系,通过网上的搜索与自己的摸索,实现方法如下(原理是利用数据库的path字段): 1.建立简单的栏目表: CREATE TABLE ` ...

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

    在MySQL数据库,设置了id为自增长类型,但由于程序还处于开发阶段,很容易的会产生错误数据,然后就直接删除了,可是id的自增长值没有跟着减少,这里提示: 如果表中数据没有用,直接删除了数据,自动增长 ...

  3. PowerDesigner连接Oracle数据库建表序列号实现自动增长

    原文:PowerDesigner连接Oracle数据库建表序列号实现自动增长 创建表就不说了.下面开始介绍设置自动增长列. 1 在表视图的列上创建.双击表视图,打开table properties — ...

  4. Hibernate 注解 没有加@Column一样会在数据库创建这些字段

    Hibernate 注解 没有加@Column一样会在数据库创建这些字段 如下一个注解类: package com.hyy.hibernate.one_to_many.domain; import j ...

  5. 利用数据库视图实现WEB查询敏感信息接口动态脱敏

    前言: 利用数据库视图,实现web接口查询敏感信息时动态脱敏. 具体目标:某接口为用户信息查询接口,返回敏感用户信息(id,姓名.手机号[敏感].身份证号[敏感]),如果web用户为管理员角色,则查询 ...

  6. Java 通过JDBC查询数据库表结构(字段名称,类型,长度等)

    Java 通过JDBC查询数据库表结构(字段名称,类型,长度等) 发布者:唛唛家的豆子   时间:2012-11-20 17:54:02   Java 通过JDBC查询数据库表结构(字段名称,类型,长 ...

  7. Django数据库设计中字段为空的方式

    今天在做数据库设计的时候,设计了如下User表,其中我把email和phone字段设置为允许为空: class User(models.Model): username = models.CharFi ...

  8. SQL Server数据库自增字段正确的插入值的描述

    我们今天主要向大家讲述的是SQL Server数据库之向SQL Server自增字段正确的插入值的实际操作步骤,在一般的情况下,我们不能向 SQL Server 数据库自增字段中插入值,如果非要这么干 ...

  9. MySQL数据库添加一个字段

    MySQL数据库添加一个字段 1.添加一个字段 alter table tableName add 列名  数据类型; 2.添加一个字段设置默认值 alter table tableName add ...

随机推荐

  1. 原生js实现二级联动下拉列表菜单

    二级联动下拉列表菜单的难点在于对后台返回的数据进行解析,不多逼逼,直接上代码 上图是后台返回的数据 实现代码如下: var deviceNotExist = true;//防止数据重复 if(data ...

  2. vue 环境的搭建及初始化项目

    其实超级简单,虽然网上很多,但是我顺便记录下相当于做笔记吧 1nodejs 的安装, 在node官网下载,点击安装,安装的时候最好选择路径在d盘 2设置环境变量 我的电脑-->属性-->系 ...

  3. js replace替换 忽略大小写问题

    实现就是控制台的内容“abc”,但是后台返回的是“ABC”,这个时候在前台遍历,需要将后台返回的在控制台标红. 当然控制台可以是 abc Abc等大小写混合,以下代码都可替换. var flagnew ...

  4. (后端)Java中关于金额大小写的工具类

    /** * 金额小数转换成中文大写金额 * * @author Neil Han * */ private static final String UNIT[] = { "万", ...

  5. shell下变量比较最佳实践

    https://stackoverflow.com/questions/13617843/unary-operator-expected If you know you're always going ...

  6. 学习使用TestNG进行数据驱动测试

    转自: https://mp.weixin.qq.com/s/8Bd8LEhiC2pu2VMcyNMGlQ 学习使用TestNG进行数据驱动测试 赵吃饭 51Testing软件测试网 前天   学习使 ...

  7. Navicat连接Oracle 报 ORA-12737 set CHS16GBK错误

            4,680   今天看到0day5上面更新了一个用友ERP的漏洞,确实可以下载任意文件:但是用友ERP基本上都是使用了oracle数据库,必须要有一个好的数据库连接工具才可以,Navi ...

  8. SAP SD模块功能构成

  9. 【Java学习系列】第4课--Java Web相关

    本文地址 分享提纲: 1.概述 2. Jsp基础 2.1 1.概述 1.1)[来源和先导] 本文主要的java web的教程来源JSP是 菜鸟教程JSP 和 天码营Java Web.     主要的先 ...

  10. Python3.6安装及引入Requests库

    本博客可能没有那么规范,环境之类的配置.只是让你直接开始编程写python. 至于各种配置网络上有多种方法. 本文仅代表我的观点的一种方法. 电脑环境:win10 64位 第一步:下载python. ...