【问题标题】:Adding string to the primary key?将字符串添加到主键?
【发布时间】:2013-07-23 12:15:00
【问题描述】:

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

例子:

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

'EMP101'
'EMP102'
'EMP103'

如何实现?

【问题讨论】:

  • 您希望主键列始终以EMP 开头,这不是多余的吗?您应该在要显示它的地方或至少在视图中执行此操作。
  • 这是什么版本的 SQL Server?
  • 查看link..
  • 也许你应该解释一下你为什么想要那个。可能会有更好的解决方案。

标签: sql sql-server auto-increment varchar


【解决方案1】:

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

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

或者这个:(对于 SQL Server

UPDATE MyTable
SET EMPID = 'EMP' + EMPID

【讨论】:

  • 在主键列中,'EMP' 对于所有行都是常量,我只想增加 101,102,103 的整数。它应该生成诸如“EMP101”、“EMP102”、“EMP103”之类的主要值。
  • @ramits - 主键如何才能成为每一行的“EMP”?您能否通过一些示例数据和预期结果解释您到底想要什么?
  • 通常主键列会生成自动唯一编号,我的问题是我想在唯一编号中添加一些字符串(即)“EMP”,例如“EMP101”、“EMP102”、“EMP103”。
  • @ramits - 然后我也做了同样的事情。我已经用 SQLFiddle 示例更新了答案。如果您想将 EMP 与 PK 列连接,那么您的列需要是字符串类型(例如 Varchar)。
  • 但我想在创建表本身时实现它
【解决方案2】:

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

【讨论】:

  • 自然键与代理键的争论由来已久,双方都有很好的论据。这种说法过于笼统。
【解决方案3】:

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

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

可能正在阅读以下帖子可能会有所帮助:

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

SQL primary key: integer vs varchar

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:
      选择'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 从双 ) 一种

      【讨论】:

        【解决方案6】:

        由于您想在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

        【讨论】:

          【解决方案7】:

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

          我想要一个像“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))

          谢谢。

          【讨论】:

          • 问答没用。
          • 如果提出原始问题的人选择使用 Excel 来编译数据并将其附加到他的数据库中,这可能会有所帮助。我只是希望有人可能有一个完全在 SQL 中的解决方案。在某种程度上,原始问题有答案,但在我的示例中,字符串是可变的,并且取自新记录本身。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-21
          • 2010-12-11
          • 1970-01-01
          相关资源
          最近更新 更多