Как создать столбец с идентификатором, который увеличивается при каждой вставке - PullRequest
0 голосов
/ 09 марта 2012

Это моя таблица, в которой я хочу, чтобы мое PNRNo было сгенерировано как «PNRRES001» для первой записи, и последовательные записи с «PNRRES002», «PNRRES002» и так далее.Таким образом, при создании только таблицы я вызвал этот столбец для функции, которая будет генерировать номер PNR, пользователю просто нужно ввести CustomerNo из внешнего интерфейса, а данные с PNR и номер клиента будут обновлены в таблице PNRDetails.

Вы можете запустить это. И, пожалуйста, помогите, если вы найдете что-нибудь, что может мне помочь.любая помощь будет оценена ... Жду вашего любезного ответа ...

Ответы [ 5 ]

6 голосов
/ 09 марта 2012

Вместо этого можно попробовать использовать вычисляемый столбец и столбец идентификаторов.

create table PNRDetails
(
  ID int identity,
  PNRNo as 'PNRRES'+right(1000+ID, 3),
  customerNo int
)
5 голосов
/ 09 марта 2012

Я бы предложил просто использовать IDENTITY вместо своего идентификатора, позволить SQL Server обрабатывать присвоение каждого номера идентификатора со всеми встроенными средствами защиты для параллелизма и оставить форматирование до пользовательского интерфейса. ... или создайте вычисляемый столбец , который определяет отформатированную версию идентификатора, если он вам действительно нужен в БД.

Риск, которым вы рискуете при использовании намеченного вами подхода:

  • низкая производительность
  • проблемы параллелизма - если одновременно генерируется множество идентификаторов
1 голос
/ 09 марта 2012

Если вы счастливы изменить структуру таблицы. Следующее сделает работу.

CREATE TABLE [dbo].[PNRDetails](
[autoId] [int] IDENTITY(1,1) NOT NULL,
[prnNo]  AS ('PNRRES'+right('000'+CONVERT([varchar](3),[dbo].[GetRowCount]([autoId]),(0)),(3))),
[customerNo] [int] NOT NULL,
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED 
(
[autoId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

РЕДАКТИРОВАТЬ: для решения проблемы идентификации по вашему требованию, пожалуйста, создайте следующую функцию и передайте [autoId] как указано выше (отредактировано) в вычисляемом столбце.

CREATE FUNCTION dbo.GetRowCount
(
@autoId INT
)
RETURNS INT
AS
BEGIN
DECLARE @RESULTS AS INT
SELECT @RESULTS = COUNT(autoId) FROM PNRDetails WHERE PNRDetails.autoId<@autoId
    RETURN @RESULTS + 1
END
GO

- ВСТАВИТЬ

INSERT INTO PNRDetails (customerNo) VALUES(5)
0 голосов
/ 09 марта 2012

Измените способ работы вашего триггера.Примерно так:

CREATE FUNCTION dbo.fn_FuncIncPNR(@ID int)
RETURNS varchar(20)
BEGIN
Declare @Retval varchar(20),
        @No varchar(4)
Select @No = convert(varchar(4), @ID)
while Len(@No) < 4
    Select @No = '0' + @No      

Select @Retval = 'PNRRESA' + @No
RETURN @Retval
END

Вы заметите, что есть поле параметра

Измените создание таблицы на это

CREATE TABLE PNRDetails(PNRNo AS (dbo.fn_ShowPNRNo(wID)), wID int IDENTITY(1,1) NOT NULL, customerNo INT)

Это должно решить вашу проблему

0 голосов
/ 09 марта 2012

1) Вы можете использовать идентификационный столбец в вашей базе данных (INTEGER)

PROS: легко / Нет пробелов между сгенерированными идентификаторами

ПРОТИВ: Вы должны выбрать вставленныйid и возврат через процедуру / запрос, если вы хотите показать его конечному пользователю

2) Определить последовательность базы данных

PROS: легко реализовать / Может быть сохранено /показывается пользователю перед сохранением формы

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

3).Выберите max (id) из столбца + 1

PROS: полезно, когда в таблицу вставляется только один пользователь

CONS: катастрофически, если вы находились в среде, где несколько пользователей вставляли вта же таблица (несовпадающие максимальные идентификаторы)

4) Использование триггера базы данных для автоинкрементации столбца

PROS: автоматизировано

CONS: сложно отладить(вы должны убедиться, что он не сломался по какой-то причине, иначе вставка не удалась)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...