powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сдвиг Identity Increment в таблице?
22 сообщений из 22, страница 1 из 1
Сдвиг Identity Increment в таблице?
    #39965304
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, помогите советом.

У меня есть 10 БД, в каждой БД по 1 таблице, таблицы во всех БД имеют одинаковую структуру:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
USE [ID_0]
GO

/****** Object:  Table [dbo].[Posts]    Script Date: 02.06.2020 12:22:59 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Posts](
	[Id] [bigint] IDENTITY(19538210220,10) NOT FOR REPLICATION NOT NULL,
	[hash_Url] [uniqueidentifier] NULL,
	[PublishDate] [datetime] NULL,
	[Timestamp] [datetime] NULL,
PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Posts] ADD  DEFAULT (getutcdate()) FOR [Timestamp]
GO



В данный момент, если получить MAX(ID) по всем таблицам, получается расхождение между нижней и верхней границей ID разрыв в 16млн.

ID_0 34710848780
ID_1 34703945141
ID_2 34707564312
ID_3 34705490603
ID_4 34704628894
ID_5 34701346555
ID_6 34706571656
ID_7 34701635807
ID_8 34694306628
ID_9 34701748929

Моя цель, "синхронизировать" между собой ID в этих таблицах, для этого мне нужно к максимальному ID из этого списка добавить 1млн, а остальные таблицы подогнать под это значение.

Собственно, основной вопрос, как правильно указать следующее значение Identity Increment в таблице?
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965308
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965311
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осталось понять, откуда такая странная цель.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965315
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
USE AdventureWorks2012;  
GO  
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);  
GO  



Судя по всему, для решения моей задачи, нужно воспользоваться этой инструкцией.

Правильно я понимаю? При использовании данной инструкци, на таблице, где уже есть данные, новые строки начнут вставляться с новым идентификатором? А шаг изменится или останется преждним?
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965317
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Осталось понять, откуда такая странная цель.


Не смогу точно ответить на данный вопрос, так как выполняю роль исполнителя данной задачи, но насколько я понял, при таком разрыве, не все данные попадают в отчеты при применении условий и сортировок.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965323
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
Гавриленко Сергей Алексеевич
Осталось понять, откуда такая странная цель.


Не смогу точно ответить на данный вопрос, так как выполняю роль исполнителя данной задачи, но насколько я понял, при таком разрыве, не все данные попадают в отчеты при применении условий и сортировок.
Ну так они и дальше попадать не будут в те кривы отчеты, когда завтра значения опять разъедутся.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965324
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
teCa
пропущено...


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


Ну это значение держится последние пол года, поэтому, если и разъезжаются значения, то не сильно, поэтому завтра и через неделю, это значение будет не критично.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965326
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
Гавриленко Сергей Алексеевич
пропущено...
Ну так они и дальше попадать не будут в те кривы отчеты, когда завтра значения опять разъедутся.


Ну это значение держится последние пол года, поэтому, если и разъезжаются значения, то не сильно, поэтому завтра и через неделю, это значение будет не критично.


IDENTITY не гарантирует последовательность. Там есть кеширование. Может произойти откат транзакции и т.п . Если у вас стоит задача пронумеровать строки и иметь четкую последовательность или какой-то особенный способ нумерации, то эту задачу надо решать иными средствами без IDENTITY. Например, через ROW_NUMBER(). SEQUENCE тоже картины не изменит.

Для сортировки данных нужно завести специальное поле, например, XXXX_ORDER_BY и заполнять его требуемым способом. В хранилищах данных это распространенная практика. Не путайте сортировочное поле с первичным ключом, бизнес ключом или суррогатным ключом. Оно должно быть отдельным.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965331
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
teCa
пропущено...


Ну это значение держится последние пол года, поэтому, если и разъезжаются значения, то не сильно, поэтому завтра и через неделю, это значение будет не критично.


IDENTITY не гарантирует последовательность. Там есть кеширование. Может произойти откат транзакции и т.п . Если у вас стоит задача пронумеровать строки и иметь четкую последовательность или какой-то особенный способ нумерации, то эту задачу надо решать иными средствами без IDENTITY. Например, через ROW_NUMBER(). SEQUENCE тоже картины не изменит.


У меня нет задачи изменить нумерацию строк, у меня задача - между базами сократить разрыв в ИД, например:
ID_0 250 -> ID_0 350
ID_1 111 -> ID_1 351
ID_2 202 -> ID_2 352
ID_3 93 -> ID_3 353

При этом, в таблице БД ID_1 значения будут идти в сл порядке:
ID
111
351
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965333
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю, мне не нужна четкая последовательность, мне просто нужно разрыв в 16млн сократить до нескольких десятков тысяч например.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965337
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
мне просто нужно разрыв в 16млн сократить до нескольких десятков тысяч например.


...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965364
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
Добавлю, мне не нужна четкая последовательность, мне просто нужно разрыв в 16млн сократить до нескольких десятков тысяч например.


Вам бы сначала разобраться, почему у вас возникает "разрыв".

Предположу что:
Во всех таблицах "Posts" вы содержите одинаковые данные
Какая то таблица является исходной
По мере её заполнения Вы периодически копируете новые строки в остальные таблицы
При этом, не устанавливаете опцию identity_insert on, что влечёт собственную нумерацию поля ID в каждой из таблиц
Если я прав, используйте опцию identity_insert on для копирования или уберите IDENTITY с поля ID на вторичных таблицах


Для просто "синхронизировать" ID идея такова:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare @next_id bigint

select @next_id = MAX(last_id)+1 from 
(
 select IDENT_CURRENT('[database_1].[dbo].[Posts]')				last_id
 union
 select IDENT_CURRENT('[database_2].[dbo].[Posts]')	 
 union
 select IDENT_CURRENT('[database_3].[dbo].[Posts]')	 
 ---.....
)T

use database_1
DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  

use database_2
DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  

use database_3
DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965383
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us
teCa
Добавлю, мне не нужна четкая последовательность, мне просто нужно разрыв в 16млн сократить до нескольких десятков тысяч например.


Вам бы сначала разобраться, почему у вас возникает "разрыв".

Предположу что:
Во всех таблицах "Posts" вы содержите одинаковые данные
Какая то таблица является исходной
По мере её заполнения Вы периодически копируете новые строки в остальные таблицы
При этом, не устанавливаете опцию identity_insert on, что влечёт собственную нумерацию поля ID в каждой из таблиц
Если я прав, используйте опцию identity_insert on для копирования или уберите IDENTITY с поля ID на вторичных таблицах


Для просто "синхронизировать" ID идея такова:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare @next_id bigint

select @next_id = MAX(last_id)+1 from 
(
 select IDENT_CURRENT('[database_1].[dbo].[Posts]')				last_id
 union
 select IDENT_CURRENT('[database_2].[dbo].[Posts]')	 
 union
 select IDENT_CURRENT('[database_3].[dbo].[Posts]')	 
 ---.....
)T

use database_1
DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  

use database_2
DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  

use database_3
DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  



немного не так, данные таблиц являются партициями разделенные на кратные(0/1/2/3../9), во всех таблицах включена опция identity_insert on, в данные таблицы идет поставка, условно в равной степени. Те в конечном счете я бы делал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
use database_0
DBCC CHECKIDENT ('dbo.Posts', RESEED, @MAX_id+1000000);  

use database_1
DBCC CHECKIDENT ('dbo.Posts', RESEED, @MAX_id+1000000+1);  

use database_2
DBCC CHECKIDENT ('dbo.Posts', RESEED, @MAX_id+1000000+2);  
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965384
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахрена тогда ресидить, если вы явно вставляете значение в поле? O_o

Лютый бред, короче.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965387
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

поддерживаю, тема - полный бред. Все равно, что регламентировать длину и ширину мазков при покраске стены.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965388
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,
Не будьте так категоричны, уверен, что у такого подхода смысл есть, просто я не могу вам его пояснить.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965396
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
немного не так, данные таблиц являются партициями разделенные на кратные(0/1/2/3../9), во всех таблицах включена опция identity_insert on, в данные таблицы идет поставка, условно в равной степени.
Если включена опция identity_insert on, то это аналогично отсутствию свойства IDENTITY, и никакие сдвиги невозможны, в т.ч. используя DBCC CHECKIDENT.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965397
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
Гавриленко Сергей Алексеевич,
Не будьте так категоричны, уверен, что у такого подхода смысл есть, просто я не могу вам его пояснить.
Смысл в выравнивании, может, и есть, но что то делать с IDENTITY, когда приложение вставляет в поле конкретное значение, не выглядит осмысленным (разве что приложение при старте инициализирует начальное значение из свойств таблицы).
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965398
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
teCa
Гавриленко Сергей Алексеевич,
Не будьте так категоричны, уверен, что у такого подхода смысл есть, просто я не могу вам его пояснить.
Смысл в выравнивании, может, и есть, но что то делать с IDENTITY, когда приложение вставляет в поле конкретное значение, не выглядит осмысленным (разве что приложение при старте инициализирует начальное значение из свойств таблицы).


Скорее всего при вставке нет конкретного значения, принцип в какую партицию попадет вставка определяется каким то своим внутренним алгоритмом, id же присваивается в момент вставки.
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965399
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я скорее всего запутался и опцию IDENTITY INSERT ON принял за опцию настройки поля ID
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965406
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
Я скорее всего запутался и опцию IDENTITY INSERT ON принял за опцию настройки поля ID
А, тогда понятно.

Тогда ответ на ваш вопрос:
teCa
Собственно, основной вопрос, как правильно указать следующее значение Identity Increment в таблице?
простой - использовать DBCC CHECKIDENT

А на какое значение, сами вычисляйте, не понял я ваши объяснения про "партиции".
...
Рейтинг: 0 / 0
Сдвиг Identity Increment в таблице?
    #39965413
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
declare @next_id bigint
--/Получаем максимальное значение identity среди всего набора таблиц и сдвигаем вправо на 1млн
select @next_id = MAX(last_id)+1000000 from 
(
 select IDENT_CURRENT('[ID_0].[dbo].[Posts]')				last_id
 union
 select IDENT_CURRENT('ID_1].[dbo].[Posts]')	 
 union
 select IDENT_CURRENT('[ID_2].[dbo].[Posts]')	
  union
 select IDENT_CURRENT('[ID_3].[dbo].[Posts]')	 
  union
 select IDENT_CURRENT('[ID_4].[dbo].[Posts]')	 
  union
 select IDENT_CURRENT('[ID_5].[dbo].[Posts]')	 
  union
 select IDENT_CURRENT('[ID_6].[dbo].[Posts]')	 
  union
 select IDENT_CURRENT('[ID_7].[dbo].[Posts]')	 
  union
 select IDENT_CURRENT('[ID_8].[dbo].[Posts]')	 
  union
 select IDENT_CURRENT('[ID_9].[dbo].[Posts]')	 
)T
set @next_id = ROUND(@next_id, -1) --/Округляем до 0 полученное максимальное значение identity
select @next_id

use ID_0
select @next_id
--DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  --/Присваиваем новое значение identity нулевой таблице

use ID_1
set @next_id = @next_id+1  --/Сдвигаем на 1 значение identity учитывая кратность
select @next_id
--DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  

use ID_2
set @next_id = @next_id+1
select @next_id
--DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  

use ID_3
set @next_id = @next_id+1
select @next_id
--DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  

use ID_4
set @next_id = @next_id+1
select @next_id
--DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  

use ID_5
set @next_id = @next_id+1
select @next_id
--DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  

use ID_6
set @next_id = @next_id+1
select @next_id
--DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);

use ID_7
set @next_id = @next_id+1
select @next_id
--DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id); 

use ID_8
set @next_id = @next_id+1
select @next_id
--DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  

use ID_9
set @next_id = @next_id+1
select @next_id
--DBCC CHECKIDENT ('dbo.Posts', RESEED, @next_id);  



Грубо говоря, сделал вот так.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сдвиг Identity Increment в таблице?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]