其中包含varchar数据类型的主键列的自动增量

时间:2015-09-01 12:09:12

标签: sql-server

CREATE TABLE Persons
(
    P_Id varchar(6) NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    PRIMARY KEY (P_Id)
)
此表中的

P_Id的主键。我们希望在开始时使用默认值(PN00)生成P_Id的自动增量,同时仅插入LastName和FirstName .eg:-PN001用于第一个条目,PN002用于第二个,PN003用于第三个,依此类推。

2 个答案:

答案 0 :(得分:7)

唯一可行的解​​决方案是使用

  • ID INT IDENTITY(1,1)列,以使SQL Server处理数值的自动增量
  • 计算的,持久的列,将该数值转换为您需要的值

所以试试这个:

CREATE TABLE dbo.Persons
  (ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
   P_ID AS 'PN' + RIGHT('00000' + CAST(ID AS VARCHAR(5)), 5) PERSISTED,
   .... your other columns here....
  )

现在,每次在Persons中插入一行而未指定IDP_ID的值时:

INSERT INTO dbo.Persons(Col1, Col2, ..., ColN)
VALUES (Val1, Val2, ....., ValN)

然后SQL Server将自动且安全地增加ID值,而P_Id将包含PN00001PN00002等值。 ....等等 - 自动,安全,可靠,无重复。

答案 1 :(得分:0)

有多种方法可以解决您的问题。

  1. 您可以使用触发器。在某些事件上激活触发器。你可以创建一个触发器而不是插入人物'事件。触发事件时,然后生成新的P_Id。将此新P_Id以及所有值作为表的新记录插入。
  2. 这种方法不会与表的架构耦合。

    有关触发器的更多信息,请参阅此链接: https://msdn.microsoft.com/en-IN/library/ms189799.aspx

    在插入触发器之前,请参考此链接模拟'在SQL Server中: How to emulate a BEFORE INSERT trigger in T-SQL / SQL Server for super/subtype (Inheritence) entities?

    1. 您还可以使用过程,如:

      create procedure Persons_insert(@lastname varchar(255), @firstname                                    varchar(255))
      as 
      begin
       --write code to generate the ID as you like
       insert into Persons(p_id,lastname,firstname)values(generated_id,lastname,firstname);
      end