#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