Здесь есть что комментировать, и, как и Гордон, я не могу вписать это в один.
Во-первых, я заметил, что у вас есть столбец id
, и вы вставили значение NEWID()
внутрь. Поэтому я надеюсь , что id
не ваш CLUSTERED INDEX
, как будто он NEWID()
не оказывает ему никакой пользы. Если вы используете uniqueindentifier
для своего CLUSTERED INDEX
, используйте вместо него NEWSEQUENTIALID()
и не указывайте значение в INSERT
:
ALTER TABLE dbo.Table1 ADD CONSTRAINT DF_Table1_id DEFAULT NEWSEQUENTIALID() FOR id;
Что касается вашего INSERT
, то какЯ сказал в своем комментарии: "Использовать столбец IDENTITY
. Если вы должны , а затем иметь последовательные значения, используйте VIEW
и ROW_NUMBER
. Пусть SQL Server изящно обрабатывает увеличивающееся значение. Попытка увеличить число самостоятельно приведет только к проблемам, таким как состояние гонки, и ваши данные окажутся в гораздо худшем положении. ". К сожалению, вы не можете изменить существующий столбец на IDENTITY
, так что это немного сложнее. Скорее всего, вы захотите сделать что-то вроде:
ALTER TABLE dbo.Table1 ADD number_new int IDENTITY(1,1);
GO
SET IDENTITY_INSERT dbo.Table1 ON;
--UPdate the new column with the existing values
UPDATE dbo.Table1
SET number_new = number;
SET IDENTITY_INSERT dbo.Table1 OFF;
GO
--Drop the old column and rename
ALTER TABLE dbo.Table1 DROP COLUMN number;
EXEC sp_rename N'dbo.Table1.number_new', N'number', N'COLUMN'
Как сказал Гордон, если вам просто нужно отформатированное значение (с ведущими 0) и не беспокоиться о пробелах, используйте вычисляемый столбец:
ALTER TABLE dbo.Table1 ADD Number_f AS RIGHT(CONCAT('00000000',number),8) PERSISTED;
Если, однако, вы хотите, чтобы они были в последовательном порядке и обновлялись соответствующим образом при удалении строки или при сбое INSERT
и т. Д., Вы можете использовать представление со следующим выражением:
RIGHT(CONCAT('00000000',ROW_NUMBER() OVER (ORDER BY number ASC),8)