我想在sql中创建表时添加一些带有主键值的字符串?
示例:
我的主键列应自动生成如下所示的值:
'EMP101'
'EMP102'
'EMP103'
如何实现它?
答案 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 |
在这里,您可以看到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?
答案 4 :(得分:0)
你至少可以通过两种方式实现它:
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 演示
答案 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