-1

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

例子:

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

'EMP101'
'EMP102'
'EMP103'

如何实现?

4

7 回答 7

1

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

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

或者这个:(对于 SQL Server < 2012)

UPDATE MyTable
SET EMPID = 'EMP' + EMPID
于 2013-07-24T06:42:23.163 回答
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 |

看到这个 SQLFiddle

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

资料来源:如何在 SQL SERVER 中的 VARCHAR 列上设置 IDENTITY KEY/AUTO INCREMENT(感谢@bvr

于 2013-07-24T07:19:41.427 回答
0

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

  1. 插入新记录时动态生成新 id
  2. 创建INSTEAD OF INSERT将为您执行此操作的触发器

如果您有这样的表架构

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演示

于 2013-07-24T07:04:17.920 回答
0

似乎您要使用非整数键的唯一原因是该键是作为与另一列的字符串连接生成的,以使其唯一。

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

可能正在浏览以下帖子可能会有所帮助:

我应该设计一个主键为 varchar 或 int 的表吗?

SQL 主键:integer vs varchar

于 2013-07-24T06:59:20.753 回答
0

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

于 2013-07-24T06:46:43.193 回答
0

我想做类似的事情,但在这里看不到我的问题的答案。

我想要一个像“JonesB_01”这样的主键,因为这是我们希望我们的工作编号在我们的生产系统中表示的方式。

--ID | 名字 | 第二名 | 电话 | 等等——鲍勃·琼斯 9999-999-999

--ID = "Second_Name"+"F"第一首字母+"_(01-99)"

已包含数字 01-99 以允许具有相同姓氏和首字母缩写的客户的多个实例。在我们的行业中,同一个客户多次完成工作但没有持续重复业务的情况并不少见。我预计这个大会会持续很长时间。如果我们超过它,那么我可以简单地添加第三个整数。

我希望它自动填充以使数据输入尽可能简单。

我设法使用 Excel 公式和一些辅助单元格获得了一个解决方案,但对 SQL 还是陌生的。

--CellA2 = JonesB_01 ( =concatenate(D2+E2))

--CellB2 =“鲍勃”

--CellC2 = "琼斯"

--CellD2 = "JonesB" ( =if(B2="","",Concatenate(C2,Left(B2)))

--CellE2 = "_01" ( =concatenate("_",Text(F2,"00"))

--CellF2 = "1" ( =If(D2="","",Countif($D$2:$D2,D2))

谢谢。

于 2021-11-09T03:44:35.627 回答
-1
选择'EMP' || TO_CHAR(NVL(MAX(TO_NUMBER(SUBSTR(A.EMP_NO, 4,3))), '000')+1) AS NEW_EMP_NO
  从
     (选择“EMP101”EMP_NO
        从双
       联合所有
      选择“EMP102”EMP_NO
        从双
       联合所有
      选择“EMP103”EMP_NO
        从双
 ) 一个
于 2013-07-24T07:12:27.410 回答