SQL server sequence构造自定义自增主键

本文介绍了在SQL Server中,由于sequence不支持varchar类型的自增主键,因此通过触发器来构造自定义主键的方法。首先创建测试表和sequence,然后利用insert触发器在插入数据时生成主键。虽然触发器可以实现主键自增,但其限制较多,作者建议这种逻辑最好放在应用程序(如Java)中处理。

sequence是SQL server 2012的新特性,不过仅支持int,bigint,smallint,tinyint型。可以实现数字的自增,以及在数据库级别中实现序列号在表,多列之间的共享。具体功能参考:https://www.cnblogs.com/CareySon/archive/2012/03/12/2391581.html

目前有个需求是插入数据,需要主键实现自增,并且主键是varchar类型。sequence不支持varchar

所以考虑用insert触发器构造自定义的主键,实现如下


首先在测试数据库下建测试表:

if exists (select * from sysobjects where name = 'testTable')
drop table testTable
create table testTable
(
	id varchar(10) primary key not null,
	val varchar(100),
	val2 varchar(100),
)
go

然后建sequence:

if exists (select
SQL Server 中,有几种在查询时生成自主键的方法: ### 使用 IDENTITY 属性 在创建表时可以使用 `IDENTITY` 属性来定义自列,示例代码如下: ```sql -- 创建一个包含自主键的表 CREATE TABLE YourTableName ( ID INT IDENTITY(1,1) PRIMARY KEY, Column1 VARCHAR(50), Column2 INT ); -- 插入数据时无需指定 ID 列,它会自动递 INSERT INTO YourTableName (Column1, Column2) VALUES ('Value1', 10); ``` 在上述代码中,`IDENTITY(1,1)` 表示从 1 开始,每次递 1。 ### 使用 SEQUENCE `SEQUENCE` 是 SQL Server 2012 的新特性,支持 `int`、`bigint`、`smallint`、`tinyint` 型,可以实现数字的自以及在数据库级别中实现序列号在表、多列之间的共享。示例代码如下: ```sql -- 创建一个 sequence CREATE SEQUENCE YourSequence START WITH 1 INCREMENT BY 1; -- 创建表 CREATE TABLE YourTableName ( ID INT PRIMARY KEY DEFAULT NEXT VALUE FOR YourSequence, Column1 VARCHAR(50), Column2 INT ); -- 插入数据时无需指定 ID 列,它会使用 sequence 自动递 INSERT INTO YourTableName (Column1, Column2) VALUES ('Value1', 10); ``` ### 使用 ROW_NUMBER() 函数 在查询结果中生成自序号,这种方式并非真正的表主键,而是在查询结果中生成一个自列。示例代码如下: ```sql SELECT ROW_NUMBER() OVER (ORDER BY SomeColumn) AS ID, Column1, Column2 FROM YourTableName; ``` 在这个查询中,`ROW_NUMBER()` 函数会根据 `SomeColumn` 排序为每一行生成一个自的序号。 ### 使用 SCOPE_IDENTITY() 获取插入后的自主键值 在插入数据后,如果需要获取刚刚插入的自主键值,可以使用 `SCOPE_IDENTITY()` 函数。示例代码如下: ```sql INSERT INTO YourTableName (Column1, Column2) VALUES ('Value1', 10); SELECT SCOPE_IDENTITY(); ``` `SCOPE_IDENTITY()` 返回插入到同一作用域中的标识列内的最后一个标识值。一个范围是一个模块,如存储过程、触发器函数或批处理,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值