【问题标题】:Alpha Numeric Primary字母数字初级
【发布时间】:2013-01-13 18:03:33
【问题描述】:

我计划使用“LIBBOOKS-1214”作为主键,但我做不到。每当我输入另一个信息时,我都想要它,它会生成它作为我的主键。

这是我的代码:

CREATE TABLE tblBookInfo
(
AccessionNumber NVARCHAR(MAX)
DECLARE @RandomNumber NVARCHAR(10);
DECLARE @AccNo NVARCHAR(MAX)
DECLARE @Upper INT;
DECLARE @Lower INT

SET @Lower = 1
SET @Upper = 9999

Select @RandomNumber = Round (((@Upper - @Lower -1)* RAND() + @Lower), 0)

SET @AccNo = 'LIBBOOKS' + @RandomNumber
SELECT @AccNo

Set AccessionNumber = @AccNo
SELECT AccessionNumber
)

感谢您的帮助!非常感激。我还是 SQL-Server 的新手。

【问题讨论】:

  • 我已将您的代码放入代码块中。但是,如果您发布的代码有意义,那将是有益的。
  • 您的代码不是有效的 SQL。先解决这个问题。 SQL Server 能够处理类型为 (N)VARCHAR(x) 的主键。
  • 您的随机数绝不保证主键所需的唯一性。如果前缀始终是 LIBBOOKS,是否真的有必要将该部分存储在数据库中?
  • 如果要将列设为主键,请注意,任何索引条目的大小最多为 900 字节(为了提高效率应该小得多)。由于varchar(max) 可以是 2 GB,因此您不能索引这样的列。请改用Varchar(20) 之类的更合适。不要过度使用/滥用 varchar(max) - 仅在绝对需要时使用它 - 请参阅 What's the Point of Using VARCHAR(n) Anymore?

标签: sql sql-server


【解决方案1】:

在 SQL Server 中执行此操作的最简单方法是:

  • 如果类型为 INT IDENTITY 则为一列,它会在将行插入表中时通过生成序列号来自动处理标识符的数字部分

    CREATE TABLE dbo.tblBookInfo
     ( ID INT IDENTITY(1,1) NOT NULL,
        .... other columns here.....
     )
    
  • 一个结合了字母数字前缀和标识列的计算的、持久的列 - 类似于

    ALTER TABLE dbo.tblBookInfo
    ADD AlphaNumID AS 'LIBBOOKS-' + CAST(ID AS VARCHAR(5)) PERSISTED
    

您是否将主键定义在 ID 列上(这是我的偏好 - 确实不需要将该前缀包含在每个索引条目中并多次存储),或者您是否将其定义为由您决定真的必须在AlphaNumID 列上。为了加快搜索速度,您也可以随时在 AlphaNumID 上放置一个单独的非聚集索引。

【讨论】:

    【解决方案2】:

    如果你想建立一个表来生成它自己的PRIMARY KEYS,你需要做这样的事情:

    USE tempdb
    GO
    
    IF OBJECT_ID('tempdb.dbo.MyTable') IS NOT NULL DROP TABLE MyTable
    
    CREATE TABLE MyTable
    (
        BookID  INT IDENTITY(1,1) NOT NULL,
        Title   VARCHAR(50) NULL,
        CONSTRAINT PK_MyTable PRIMARY KEY CLUSTERED 
        (
            BookID ASC
        )
    ) ON [PRIMARY]
    
    INSERT INTO MyTable (Title) VALUES
    ('SQL Syntax Explained'),
    ('Sensible Posting explained')
    
    SELECT *
    FROM MyTable
    

    应该注意CLUSTERED INDEX 将建立在PRIMARY KEY 上,这是SQL Server 在创建表SSMS GUI 时的默认行为。这不是强制性的。

    真的很难猜出你想用你的代码实现什么。如果你能解释得更好一点,我们当然可以帮助你。

    作为关于PRIMARY KEYS 的脚注,许多人认为使用整数类型编号(TINYINTSMALLINTINTBIGINT)作为您的PK 是最佳实践。当您这样做时,据说您正在创建一个人工主键。简而言之,它们是可管理的值,INDEX 很好,并且在 JOINS 的相等性上表现良好。

    【讨论】:

      【解决方案3】:

      一种选择是使用由 2 列组成的连接主键,一个将保存 Alpha 字符串,另一个保存数字。然后,您的数字列可以使用 MarkD 建议的识别字段。

      另一种选择是使用 varchar 字段并编写一个函数来确定字母数字字符串的数值。例如。你传入函数'LIBBOOKS'并返回一个字符串'LIBBOOKS- 然后你插入它。您可以在每次插入时触发的触发器中执行此操作。

      在您的伪代码中,您将创建表和函数的开头混合以创建一个字母数字字符串。如果你完成这条路径,照常创建你的表,然后编写一段代码来创建主键。最后把它放在一起,例如创建一个触发器来调用代码以创建主键或在您的应用程序中执行此操作等,具体取决于您的设计。

      如果您要使用随机值,请记住在尝试插入之前检查是否唯一性。

      【讨论】:

        猜你喜欢
        • 2019-11-13
        • 2017-07-18
        • 1970-01-01
        • 2016-10-15
        • 2017-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多