在主键上添加字符串?

时间:2013-07-24 06:41:03

标签: sql sql-server auto-increment varchar

我想在sql中创建表时添加一些带有主键值的字符串?

示例:

我的主键列应自动生成如下所示的值:

'EMP101'
'EMP102'
'EMP103'

如何实现它?

6 个答案:

答案 0 :(得分:1)

试试这个:(对于SQL Server 2012)

UPDATE MyTable
SET EMPID = CONCAT('EMP' , EMPID)

或者:(对于SQL Server< 2012)

UPDATE MyTable
SET EMPID = 'EMP' + EMPID

答案 1 :(得分:1)

由于您想在VARCHAR类型列中设置自动增量,您可以尝试此表模式:

CREATE TABLE MyTable
    (EMP INT NOT NULL IDENTITY(1000, 1)
    ,[EMPID] AS 'EMP' + CAST(EMP AS VARCHAR(10)) PERSISTED PRIMARY KEY
    ,EMPName VARCHAR(20))
;

INSERT INTO MyTable(EMPName) VALUES
('AA')
,('BB')
,('CC')
,('DD')
,('EE')
,('FF')

输出:

|  EMP |   EMPID | EMPNAME |
----------------------------
| 1000 | EMP1000 |      AA |
| 1001 | EMP1001 |      BB |
| 1002 | EMP1002 |      CC |
| 1003 | EMP1003 |      DD |
| 1004 | EMP1004 |      EE |
| 1005 | EMP1005 |      FF |

请参阅this SQLFiddle

在这里,您可以看到EMPID是带主键的自动递增列。

来源:HOW TO SET IDENTITY KEY/AUTO INCREMENT ON VARCHAR COLUMN IN SQL SERVER(感谢@bvr

答案 2 :(得分:0)

经验法则是,永远不要在主键中使用有意义的信息(如员工编号/社会安全号码)。让它只是一个普通的自动增量整数。然而,数据似乎不变 - 它可能会在某一时刻发生变化(新立法到来,所有SSN都会重新计算)。

答案 3 :(得分:0)

似乎你想要使用非整数键的唯一原因是密钥是与另一列的字符串连接生成的,以使其唯一。

从最佳实践角度来看,强烈建议使用整数主键,但通常会忽略此指导。

可能会通过以下帖子提供帮助:

Should I design a table with a primary key of varchar or int?

SQL primary key: integer vs varchar

答案 4 :(得分:0)

你至少可以通过两种方式实现它:

  1. 插入新记录时动态生成新ID
  2. 创建将为您执行此操作的INSTEAD OF INSERT触发器
  3. 如果您有像这样的表格架构

    CREATE TABLE Table1
    ([emp_id] varchar(12) primary key, [name] varchar(64))
    

    对于第一个场景,您可以使用查询

    INSERT INTO Table1 (emp_id, name)
    SELECT newid, 'Jhon'
      FROM
    (
      SELECT 'EMP' + CONVERT(VARCHAR(9), COALESCE(REPLACE(MAX(emp_id), 'EMP', ''), 0) + 1) newid
        FROM Table1 WITH (TABLOCKX, HOLDLOCK)
    ) q
    

    这是 SQLFiddle 演示

    对于第二种情况,您可以像这样触发

    CREATE TRIGGER tg_table1_insert ON Table1
    INSTEAD OF INSERT AS
    BEGIN
      DECLARE @max INT
      SET @max = 
      (SELECT COALESCE(REPLACE(MAX(emp_id), 'EMP', ''), 0)
         FROM Table1 WITH (TABLOCKX, HOLDLOCK)
      )
    
      INSERT INTO Table1 (emp_id, name)
      SELECT 'EMP' +  CONVERT(VARCHAR(9), @max + ROW_NUMBER() OVER (ORDER BY (SELECT 1))), name
        FROM INSERTED
    END
    

    这是 SQLFiddle 演示

答案 5 :(得分:-1)

SELECT 'EMP' || TO_CHAR(NVL(MAX(TO_NUMBER(SUBSTR(A.EMP_NO, 4,3))), '000')+1) AS NEW_EMP_NO 
  FROM 
     (SELECT 'EMP101' EMP_NO 
        FROM DUAL
       UNION ALL
      SELECT 'EMP102' EMP_NO 
        FROM DUAL
       UNION ALL
      SELECT 'EMP103' EMP_NO 
        FROM DUAL 
 ) A