2013-01-13 2 views
1

Я планировал иметь первичный ключ с «LIBBOOKS-1214», но я не могу это сделать. Я хочу, чтобы всякий раз, когда я вводил другую информацию, она будет генерировать это как мой первичный ключ.Alpha Numeric Primary

Вот мой код:

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.

+1

Я поместил ваш код в кодовый блок. Однако было бы полезно, если бы код, который вы опубликовали, имел смысл. – MarkD

+0

Ваш код недействителен SQL. Исправьте это в первую очередь. SQL Server способен к первичным ключам, тип которых «(N) VARCHAR (x)». –

+0

Ваше случайное число никоим образом не гарантирует уникальность, которая требуется для первичного ключа. И если префикс всегда LIBBOOKS, действительно ли нужно хранить эту часть в базе данных? – Ilion

ответ

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.

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) в качестве PK. Когда вы это сделаете, вы, как говорят, создаете Искусственный первичный ключ. В двух словах, они являются управляемыми значениями, которые INDEX хорошо и хорошо работают на JOINS равенства.

0

Одним из вариантов было бы использовать конкатенированный первичный ключ, состоящий из 2 столбцов, один будет содержать строку Alpha, другую цифру. Тогда ваш числовой столбец может использовать поле Идентификация, как было предложено MarkD.

Другой вариант - использовать поле varchar и написать функцию, которая определяет числовое значение для буквенно-цифровой строки. Например. вы переходите в функцию «LIBBOOKS», и она возвращает строку «LIBBOOKS», после чего вы вставляете это. Вы можете сделать это в триггере, который срабатывает на каждой вставке.

В коде psudoe вы смешиваете таблицу create и начало функции для создания буквенно-цифровой строки. Если вы сделаете этот путь, создайте таблицу как обычно, а затем напишите фрагмент кода для создания первичного ключа. Наконец, puyt вместе, например. создать триггер, чтобы вызвать код для создания первичного ключа или сделать это в вашем приложении и т. д. в зависимости от вашего дизайна.

Если вы собираетесь использовать случайное значение, не забудьте проверить, если для уникальности, прежде чем пытаться вставить его.

Смежные вопросы