更新 : 2019-06-29

identity column 的局限是, 它只可以在一个 table 使用,而且它只能随着 insert 产生

另一个方法是用 SEQUENCE, sql server 2012 的功能

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-sequence-transact-sql?view=sql-server-2017

https://docs.microsoft.com/en-us/ef/core/modeling/relational/sequences

https://www.talkingdotnet.com/use-sql-server-sequence-in-entity-framework-core-primary-key/

https://blog.csdn.net/m0_38002798/article/details/78904102

它的好处是可以跨 table, 而且不需要 insert 也可能产生. 但是也有不足的地方,就是不支持 transaction , 无法 rollback

如果你的 running number 允许跳号, 那么 SEQUENCE 是最佳选择.

如果以上 2 个无法满足需求,那么就得自己通过表,锁表的方式去实现了.

有时候我们希望 Id 要好看一些,比如 Id=1 -> Id=T000001

refer :

http://www.kodyaz.com/t-sql/custom-sequence-string-as-sql-identity-column.aspx

http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server

方法有很多,我目前选择的方式是使用触发器在插入之后更新

我们把这个好看一点的Id称为 viewId 吧。

先做一个方法来格式化Id

调用 viewId = dbo.getViewId('T',CAST(inserted.Id as nvarchar(50)),6,'0');

drop function dbo.getViewId;
create function [dbo].[getViewId] (
@Prefix nvarchar(10),
@Id int,
@Length int,
@PaddingChar char(1) = ''
)
returns nvarchar(MAX)
as
begin return (
select @Prefix + RIGHT(REPLICATE(@PaddingChar, @Length) + CAST(@Id as nvarchar(10)), @Length)
) end

针对某个表写入触发器逻辑

drop trigger OrdersAfterInsert;
create trigger OrdersAfterInsert on [dbo].[Orders]
for insert
as
update Orders set viewId = dbo.getViewId('O', CAST(inserted.Id as nvarchar(50)),6,'')
from Orders inner join inserted on Orders.Id= inserted.Id;
go

如果表已经存在数据的话,要更新哦

update Orders set viewId = dbo.getViewId('O', CAST(Id as nvarchar(50)),6,'');

创建column and UNIQUE

alter table Orders add viewId nvarchar(50) null;
create unique nonclustered index [UNIQUE_Orders_viewId]
on [dbo].[Orders]([viewId] asc) where ([viewId] IS NOT NULL AND [viewId] IS NOT NULL);

使用 Entity Framewrok的话可以把这个数据标签为 Computed.

public class Order
{
[Key]
public int Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string viewId { get; set; }

以上.

SQL viewId 比较好看的 Id的更多相关文章

  1. sql实现通过父级id查询所有的子集

    通过sql实现传入父级id查询出所有的子集 最近刚好有个业务需要这样实现个功能,就是在点击查询列表详情的时候只会传入父级id,而详情得渲染出所有子集,那么做法有很多,可以直接通过代码递归查询去实现, ...

  2. SQL Server数据库sql语句生成器(SqlDataToScript)的使用(sql server自增列(id)插入固定值)

    SqlDataToScript是根据表数据进行生成 Insert Into语句,此工具还有一个好处是可以对自增列插入固定值,例如:自增的列id值为5,但是5这个行值已经删除,如果想存储Id自增列值为5 ...

  3. 多线程处理sql server2008出现Transaction (Process ID) was deadlocked on lock resources with another process and has been chose问题

    多线程处理sql server2008某个表中的数据时,在Update记录的时候出现了[Transaction (Process ID 146) was deadlocked on lock reso ...

  4. SQL注入-攻入Apple ID钓鱼网站实录

    之前写的一篇利用SQL注入方式攻击钓鱼网站的文章,现在在博客园再分享一下. 下午,朋友发了一条朋友圈,内容大概这样: 大体就是她的iPhone丢了,收到了钓鱼短信,多么熟悉的套路,如下: 还好她比较机 ...

  5. mybatis 针对SQL Server 的 主键id生成策略

    SQL Server中命令: select newId()  ,可以得到SQL server数据库原生的UUID值,因此我们可以将这条指令写到 Mybatis的主键生成策略配置selectKey中. ...

  6. 关于同时查询父子名称的SQL查询语句的写法 id name parentId parentName .

    parentid是1就是id为1的公司的子公司 如图 查询出所有的信息后 由于我要呈现的是parentName 不是parentId所以想问下SQL语句怎么写 谢谢啦~~:) 解法: SELECT s ...

  7. [经典SQL语句]根据父级ID查找所有子级ID,并将所有ID用逗号隔开返回

    树形表结构: id parentID isDel 1 0 0 2 1 0 3 1 1 4 2 0 5 2 0 一)根据父级ID查找所有子级ID,并将所有ID用逗号隔开返回 ID=,需要返回的结果(条件 ...

  8. sql指定插入自增长id的数据

    SET IDENTITY_Insert [Tag.V2].[dbo].[Members_EnAccount] ON; insert into [Tag.V2].[dbo].[Members_EnAcc ...

  9. SQL Server 存储过程自定义生成ID号

    * FROM sys.tables WHERE name=N'EmployeeNo_Identity') DROP TABLE EmployeeNo_Identity GO CREATE TABLE ...

随机推荐

  1. MySQL数据库的安装

    官方下载地址: http://downloads.mysql.com/archives/community/ msi为安装版,zip为免安装版,最新版本的MySQL没有64位windows的msi版囧 ...

  2. C++ Template Specialization (模板特化)

    个人理解这个东西说白了就是当模板类(或函数)的类型参数为某特定值时用对应的特化定义代之. 看个例子吧 #include <iostream> using namespace std; te ...

  3. Citrix 服务器虚拟化之十八 桌面虚拟化之部署MCS随机桌面池

    Citrix 服务器虚拟化之十八  桌面虚拟化之部署MCS随机桌面池 完成桌面模版的制作后,可以开始虚拟桌面池的发布 说明: 环境基于实验十七 1.登录DC服务器创建一个组织单位名为Citrix,然后 ...

  4. WPF - 这是一堆代码片段的集合

    1. Image的Source设定,引用的图片文件在其他的dll中.图片的Build action : Resource 如果是直接写: Source="/MyProject.Resourc ...

  5. 使用MJRefresh遇到的坑

    在使用MJRefresh的时候,下拉刷新表头停在了上部,箭头并没有隐藏 解决方法:进行数据请求的时候不要使用 beginRefresh方法,要直接调用方法进行数据请求

  6. Unity3D基础学习 NGUI自带Tooltip制作提示文字

    简介 NGUI自带的的例子Character中含有一个Tooltip,可以鼠标悬浮到某对象时显示提示文字.非常方便. 创建UITooltip 首先你需要在场景NGUi相机下建立一个空物体我把它命名为T ...

  7. 我与Ubuntu的5年共成长

    初次接触Ubuntu那还是2010年的初夏,那年大学二年级即将结束,为了增加计算机学院学生的技术能力和就业竞争力,学校组织了很多培训机构.公司企业来学校做技术宣讲.分享等 记得有一个企业是做Mp3 M ...

  8. Android SimpleAdapter ListView (锁定手机,解锁手机的列表)

    SimpleAdapter是扩展性最好的适配器,可以定义各种你想要的布局. 构造方法: SimpleAdapter(Context context, List<? extends Map< ...

  9. jQuery 第一阶段 学习使用总结

    jQuery 是一个 JavaScript 库,位于一个 JavaScript 文件中,其中包含了所有的 jQuery 函数.在平常的使用过程中,会常常与JavaScript,配合css使用,能够令网 ...

  10. Windows Server 2008 R2 搭建FTP服务

    一.安装ftp服务 1.在服务管理器"角色"右键单击"添加角色".  2.下一步. 3.勾选"Web 服务器(IIS)",下一步. 4.勾选 ...