SQL Server中创建含字母数字主键的Shop表及自增问题
在SQL Server中创建带字母数字自增主键的Shop表
一、创建以字母数字类型为主键的表
SQL Server中可以用VARCHAR或NVARCHAR作为字母数字类型的主键,以下是基础的Shop表创建语句:
CREATE TABLE Shop ( ShopID VARCHAR(20) PRIMARY KEY, -- 字母数字主键,长度可按需调整 ShopName NVARCHAR(100) NOT NULL, Address NVARCHAR(200), CreateTime DATETIME DEFAULT GETDATE() );
主键约束会自动保证ShopID的唯一性,若需要更灵活的唯一性控制,也可搭配UNIQUE约束使用。
二、实现字母数字主键的自增效果
SQL Server没有直接支持字母数字类型的原生自增(类似INT类型的IDENTITY属性),但可以通过两种常用方式实现类似效果:
方法1:序列(SEQUENCE)+ 默认值
通过创建序列生成自增数字,再拼接前缀生成字母数字主键:
- 先创建自增序列:
CREATE SEQUENCE ShopIDSequence START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999 -- 可根据预期店铺数量调整最大值 CYCLE NO; -- 禁止循环,避免主键重复
- 给
ShopID字段添加默认值(创建表时直接指定或后续修改均可):
ALTER TABLE Shop ADD CONSTRAINT DF_Shop_ShopID DEFAULT 'SHOP' + RIGHT('000000' + CAST(NEXT VALUE FOR ShopIDSequence AS VARCHAR(6)), 6) FOR ShopID;
插入数据时无需指定ShopID,系统会自动生成类似SHOP000001、SHOP000002的主键值:
INSERT INTO Shop (ShopName, Address) VALUES ('晨光文具店', 'XX街道123号'), ('鲜果超市', 'YY路456号');
方法2:IDENTITY列+计算列
创建隐藏的自增整数列,通过计算列拼接前缀生成字母数字主键,这种方法稳定性更强:
CREATE TABLE Shop ( ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, -- 隐藏的自增整数主键,保证自增逻辑稳定 ShopID AS 'SHOP' + RIGHT('000000' + CAST(ID AS VARCHAR(6)), 6) PERSISTED UNIQUE, -- 持久化计算列,对外提供字母数字主键 ShopName NVARCHAR(100) NOT NULL, Address NVARCHAR(200), CreateTime DATETIME DEFAULT GETDATE() );
PERSISTED关键字表示计算列的值会存储在磁盘上,避免每次查询重新计算;UNIQUE约束确保ShopID的唯一性。插入数据时同样无需指定ShopID和ID:
INSERT INTO Shop (ShopName, Address) VALUES ('晨光文具店', 'XX街道123号'), ('鲜果超市', 'YY路456号');
注意事项
- 可根据实际需求调整前缀(如
SHOP改为STORE)和数字位数(如把6位改为8位,对应修改RIGHT('00000000' + CAST(...) AS VARCHAR(8)), 8)。 - 使用序列的方法若需重置自增起始值,可执行
ALTER SEQUENCE ShopIDSequence RESTART WITH 1;。 - 计算列方法中,
ID作为集群主键保证了自增的性能和稳定性,ShopID作为唯一非集群键对外提供业务标识。
内容的提问来源于stack exchange,提问作者Okeke
相关产品推荐
相关产品推荐

