SQL Server: идентификация и автоинкремент для varchar

#sql-server #tsql

#sql-сервер #tsql

Вопрос:

Это мой первый вопрос на этой платформе. Я работаю над проектом базы данных. Я хочу использовать автоинкремент для моего первичного ключа для id , но также хочу добавить перед ним алфавит. Существуют ли другие способы сделать это, кроме использования двух столбцов, объявляющих один как идентификатор, а другой — как кастинг? Я работал с хранимыми процедурами и триггерами.

Спасибо

PS: Я хочу сделать это, используя один столбец, если это возможно

Комментарии:

1. IDENTITY предназначен только для числовых значений. Вы могли бы добавить AFTER INSERT триггер, который получает вновь созданную строку, а затем обновляет ваш буквенно-цифровой столбец.

2. Как выглядит этот буквенно-цифровой символ?

Ответ №1:

Вы не сможете сделать это только с одним столбцом.

Лучшим решением является использование

  • ID INT IDENTITY(1,1) столбец, позволяющий SQL Server обрабатывать автоматическое увеличение вашего числового значения
  • вычисляемый, сохраняемый столбец для преобразования этого числового значения в нужное вам значение

Итак, попробуйте это:

 CREATE TABLE dbo.tblCompany
(
      ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
      CompanyID AS 'CMP-'   RIGHT('00000'   CAST(ID AS VARCHAR(5)), 5) PERSISTED,
      .... your other columns here....
)
  

Теперь каждый раз, когда вы вставляете строку в tblCompany без указания значений для ID или CompanyID :

 INSERT INTO dbo.tblCompany(Col1, Col2, ..., ColN)
VALUES (Val1, Val2, ....., ValN)
  

затем SQL Server увеличит ваше ID значение и CompanyID будет содержать такие значения, как CMP-00001 , CMP-00002 …… и так далее — автоматически. CompanyID Столбец будет заполнен автоматически SQL Server при вставке новой строки — поэтому нет необходимости в триггерах, хранимых процедурах или чем-либо еще — просто это объявление в вашем определении таблицы.

ОБНОВЛЕНИЕ: если вы используете SQL Server 2012 или новее, вы можете сделать это только с одним столбцом — если вы также создадите SEQUENCE — подобный этому:

 CREATE SEQUENCE SEQ_CompanyID
AS INT
START WITH 1000
INCREMENT BY 1;

CREATE TABLE dbo.Company
(
    CompanyID VARCHAR(20) NOT NULL
        CONSTRAINT DF_CompanyID
        DEFAULT('CMP-'   CAST(NEXT VALUE FOR dbo.SEQ_CompanyID AS VARCHAR(10))),
    CompanyName VARCHAR(100) NOT NULL,
    ----- other columns here
)
  

Теперь, если вы убедитесь, что вставляете с пропуском CompanyID столбца в инструкции insert, вот так:

 INSERT INTO dbo.Company (CompanyName)
VALUES ('Company #1'), ('Company ABC'), ('Company Three');
  

затем вы получаете CMP-1001', 'CMP-1002 etc. в качестве вашего CompanyID , опять же, автоматически обрабатываемого SQL Server при вставке новой строки.

Комментарии:

1. Когда я прочитал «Вы не сможете сделать это только с одним столбцом», я подумал: «Конечно, вы могли бы, если бы использовали последовательность …» и тогда вы были правы в этом. 1