使用字符串值作为主键
Using String values for primary key
我可以将 SOF/2015/01
存储为我的 ID,我可以像通常的主键一样自动递增 01
吗?
Can I store SOF/2015/01 as my ID
回答:可以
can I auto increment 01 like usual primary key.
答案:不,你不能
自动递增只能递增数字。
您必须手动执行此操作。
您可以在触发器中使用函数来生成您想要的自动递增数字,如下所示
create function NextCustomerNumber()
returns char(5)
as
begin
declare @lastval char(5)
set @lastval = (select max(customerNumber) from Customers)
if @lastval is null set @lastval = 'C0001'
declare @i int
set @i = right(@lastval,4) + 1
return 'C' + right('000' + convert(varchar(10),@i),4)
end
这可能会导致一些问题,但是:
- 如果两个进程试图向 table 添加一行
同时?您能否确保不会为以下内容生成相同的值
两个进程?
- 每次您都需要查询现有数据时可能会产生开销
插入新数据
- 除非这是作为触发器实现的,否则这意味着所有插入
您的数据必须始终通过相同的存储过程
计算这些序列。这意味着批量进口或移动
从生产到测试等的数据,可能是不可能的或
可能效率很低。
- 如果它作为触发器实现,它是否适用于基于集合的
多行 INSERT 语句?如果是这样,效率如何?这个
如果为单个基于集合的每一行调用函数将不起作用
INSERT -- 返回的每个 NextCustomerNumber() 都是相同的值。
您可以从 this
了解更多
你当然可以使用 NCHAR
或 NVARCHAR
类型作为主键,前提是任何可变大小的列不使用 MAX
,并且数据不超过索引的最大允许大小。
至于将其用作自增列,那是行不通的。 SQL 非常聪明,但不是那么聪明。
我建议将该字符串分成两列或三列,这样您就可以将 "01"
部分存储为单独的 IDENTITY
列。但肯定这是一个设计问题,您必须自己解决。
另一个解决方案是触发器,但我通常会犹豫是否使用类似这样的东西作为主键。使用数字类型在很多方面都更好,特别是当您必须在别处引用表格时。您总是可以在字符串表示上应用 UNIQUE
索引。
创建一个双列唯一主键,其中字符串 'SOF/2015' 作为第一部分,自动递增整数作为第二列。您可以使用 returns 一个字符串的函数来组合这两列,从而为您提供组合键。对于语法糖,您可以在 table 上创建一个视图,使用您的函数将键组合到一个视图列中。
我可以将 SOF/2015/01
存储为我的 ID,我可以像通常的主键一样自动递增 01
吗?
Can I store SOF/2015/01 as my ID
回答:可以
can I auto increment 01 like usual primary key.
答案:不,你不能
自动递增只能递增数字。
您必须手动执行此操作。
您可以在触发器中使用函数来生成您想要的自动递增数字,如下所示
create function NextCustomerNumber()
returns char(5)
as
begin
declare @lastval char(5)
set @lastval = (select max(customerNumber) from Customers)
if @lastval is null set @lastval = 'C0001'
declare @i int
set @i = right(@lastval,4) + 1
return 'C' + right('000' + convert(varchar(10),@i),4)
end
这可能会导致一些问题,但是:
- 如果两个进程试图向 table 添加一行 同时?您能否确保不会为以下内容生成相同的值 两个进程?
- 每次您都需要查询现有数据时可能会产生开销 插入新数据
- 除非这是作为触发器实现的,否则这意味着所有插入 您的数据必须始终通过相同的存储过程 计算这些序列。这意味着批量进口或移动 从生产到测试等的数据,可能是不可能的或 可能效率很低。
- 如果它作为触发器实现,它是否适用于基于集合的 多行 INSERT 语句?如果是这样,效率如何?这个 如果为单个基于集合的每一行调用函数将不起作用 INSERT -- 返回的每个 NextCustomerNumber() 都是相同的值。
您可以从 this
了解更多你当然可以使用 NCHAR
或 NVARCHAR
类型作为主键,前提是任何可变大小的列不使用 MAX
,并且数据不超过索引的最大允许大小。
至于将其用作自增列,那是行不通的。 SQL 非常聪明,但不是那么聪明。
我建议将该字符串分成两列或三列,这样您就可以将 "01"
部分存储为单独的 IDENTITY
列。但肯定这是一个设计问题,您必须自己解决。
另一个解决方案是触发器,但我通常会犹豫是否使用类似这样的东西作为主键。使用数字类型在很多方面都更好,特别是当您必须在别处引用表格时。您总是可以在字符串表示上应用 UNIQUE
索引。
创建一个双列唯一主键,其中字符串 'SOF/2015' 作为第一部分,自动递增整数作为第二列。您可以使用 returns 一个字符串的函数来组合这两列,从而为您提供组合键。对于语法糖,您可以在 table 上创建一个视图,使用您的函数将键组合到一个视图列中。