【问题标题】:How to create a table in sql server that has an id column with numbers and letters如何在sql server中创建一个包含数字和字母的id列的表
【发布时间】:2015-05-01 23:03:51
【问题描述】:

我的 sql 服务器有问题。

我希望能够创建一个只有一个包含字母和数字的 id 列的表。插入新行时,数字应自动递增。

字母不应该改变,只有数字应该像行一样增加。 我希望能够查看 id 并告诉员工来自哪个部门以及他/她是什么号码。例如 IT001 然后 IT002 等等。

提前致谢

【问题讨论】:

  • 最好有两列!
  • 我知道两个更好,但为此我必须只有一个。
  • @Musi 你不能直接这样做,但这是一个很好的方法stackoverflow.com/a/16801288/2161256
  • 这被称为智能钥匙,并不是最佳实践。您可以通过其他方式获取此信息。例如,部门 ID 应该是外键。
  • 出于好奇,为什么不能有两列?有什么限制?

标签: sql-server database


【解决方案1】:

您最好使用计算列,除了列创建之外,它不会涉及您的任何编码。这是一个示例表创建脚本。查看FriendlyID专栏

CREATE TABLE [dbo].[ITEMS](
[ITEMID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
[FriendlyID]  AS ('IT'+CONVERT([varchar](31),[ITEMID],0)),
 CONSTRAINT [PK_ITEMS] PRIMARY KEY CLUSTERED 
(
    [ITEMID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

GO

INSERT INTO ITEMS VALUES ('John')
INSERT INTO ITEMS VALUES ('Sam')
INSERT INTO ITEMS VALUES ('Kate')

SELECT * FROM ITEMS

【讨论】:

  • 我不希望有两列,如 ITEMID 和 Friendly ID。我只想要一列。
  • 你不能总是拥有你想要的 :-) 只有三种方法可以做到这一点。 触发器创建列,使用Computed列或使用View
【解决方案2】:

代替触发器的理想选择:

CREATE TABLE Employees (
    Id   VARCHAR(16) PRIMARY KEY,
    Name VARCHAR(64)
);
GO

CREATE TRIGGER InsteadTrigger on Employees
INSTEAD OF INSERT
AS
BEGIN
  BEGIN TRANSACTION

  DECLARE @maxvalue INT = (SELECT MAX(CAST(SUBSTRING(Id, 3, 16) as INT)) FROM Employees )
  INSERT INTO Employees (Id, Name)
       SELECT 'IT' + CAST(ISNULL(@maxvalue, 0) + 1 AS VARCHAR(16)), Name
       FROM inserted

  COMMIT TRANSACTION
END;
GO

【讨论】:

  • 如果两个进程同时尝试插入,有可能两个进程都将获得相同的 @maxid 值,而其中一个进程将失败,因为它试图插入重复值。跨度>
  • @AdamPorad 由交易修复
  • 不会投反对票,因为如果你很绝望,这会起作用,但在我看来,触发器增加的复杂性在这里不值得。很难清楚地记录下来,每次有人重新访问时,他们都必须做一些神秘的解决来记住是什么生成了这些密钥。
  • 是否可以让ID自动生成,这样只要插入名字就会自动分配ID号。
  • @Musi:实际上,触发器做到了
【解决方案3】:

您可以拥有“计算列”。

在表中保留整数标识列是一种很好的做法,因此除了删除它之外,您还可以根据标识列和要添加前缀的文本添加新列。

这将是表设计器中带有“计算列规范”的普通字符串列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多