我计划使用'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的新手。
答案 0 :(得分: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
上添加单独的非聚集索引。
答案 1 :(得分:0)
如果你想构建一个生成它自己的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
时的默认行为。这不是强制性的。
要想用你的代码尝试实现的目标真的很难。如果你能更好地解释一下,我们当然可以帮助你。
作为关于TINYINT
的脚注,许多人认为使用整数类型编号(SMALLINT
,INT
,BIGINT
,{{1} })作为PK
。当您这样做时,据说您正在创建人工主键。简而言之,它们是可管理的值INDEX
并且在JOINS
平等上表现良好。
答案 2 :(得分:0)
一种选择是使用由2列组成的连锁主键,一列将保持Alpha字符串,另一列保存数字。然后您的数字列可以使用MarkD建议的识别字段。
另一种选择是使用varchar字段并编写一个函数来确定字母数字字符串的数值。例如。你传入函数'LIBBOOKS'并返回一个字符串'LIBBOOKS-然后你插入它。您可以在触发每个插入的触发器中执行此操作。
在你的psudoe代码中,你混合了create table和一个函数的开头来创建一个字母数字字符串。如果你完成这个路径就像正常一样创建你的表,然后写一堆代码来创建主键。最后将它拼凑在一起,例如根据您的设计,创建一个触发器来调用代码来创建主键或在您的应用程序中执行此操作等。
如果您打算使用随机值,请记住在尝试插入之前检查是否为唯一性。