Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Стали создаваться айдишники не по порядку  [new]
Паша01
Member

Откуда:
Сообщений: 310
Всем привет!
Есть таблица с id:

[id] [bigint] IDENTITY(1,1) NOT NULL    
...    
CONSTRAINT [issue_id] 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] 


Но в последнее время айдишники почему-то перестали создаваться по порядку, а с прибавлением какого-то рандомного значения. Посмотрел в базе данных у первичного ключа свойство Identity specification, все норм, т.е. seed = 1 и increment = 1. В чем может быть дело?
27 окт 14, 15:01    [16763832]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Glory
Member

Откуда:
Сообщений: 104751
Паша01
В чем может быть дело?

В том, что они и не должны создаваться по-порядку
27 окт 14, 15:02    [16763846]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Паша01
Member

Откуда:
Сообщений: 310
Glory
Паша01
В чем может быть дело?

В том, что они и не должны создаваться по-порядку

Но почему? Ведь настройка для id стоит
IDENTITY(1,1)
27 окт 14, 15:07    [16763876]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Glory
Member

Откуда:
Сообщений: 104751
Паша01
Но почему? Ведь настройка для id стоит

Потому, что
- вы не один, кто добавляет записи
- записи можно удалять
- IDENTITY можно задавать явно при добавлении
- IDENTITY можно менять
27 окт 14, 15:10    [16763895]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Паша01
Member

Откуда:
Сообщений: 310
Glory
Потому, что
- вы не один, кто добавляет записи
- записи можно удалять
- IDENTITY можно задавать явно при добавлении
- IDENTITY можно менять


Аудитория приложения очень маленькая и разница между айдишниками очень большая, доходит до 1000.
А как проверить, что кто-то без моего ведома вдруг поменял IDENTITY ?
27 окт 14, 15:13    [16763912]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Glory
Member

Откуда:
Сообщений: 104751
Паша01
Аудитория приложения очень маленькая и разница между айдишниками очень большая, доходит до 1000.

Еще раз.
IDENTITY никогда не гаратировала непрерывной последовательности

Паша01
А как проверить, что кто-то без моего ведома вдруг поменял IDENTITY ?

Прверять наличие соответствующих команд.
27 окт 14, 15:15    [16763922]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Была уже тема: Identity прыгнуло на 1000
27 окт 14, 15:21    [16763957]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Glory
Паша01
Но почему? Ведь настройка для id стоит

Потому, что
- вы не один, кто добавляет записи
- записи можно удалять
- IDENTITY можно задавать явно при добавлении
- IDENTITY можно менять


+ при откате транзакции identity не откатывается -- появляется пробел.

Вопрос в другой -- а почему так критично, чтобы не было пропусков? Если в этом есть логика, то надо её реализовывать как-то по другому на уровне вашего приложения. Может быть находить максимальное значение и прибавлять 1 (и гарантировать, что это может делать только одна транзакция).
27 окт 14, 15:27    [16764002]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Паша01
Member

Откуда:
Сообщений: 310
Просто хочется знать причину такого поведения =)
Ещё только что кое-что заметил: использую команду
DBCC CHECKIDENT ('Issue');

и получаю разные со временем разные значения ID, хотя запись в таблицу не добавлена. Как можно посмотреть историю операций?
27 окт 14, 15:33    [16764034]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Glory
Member

Откуда:
Сообщений: 104751
Паша01
Просто хочется знать причину такого поведения =)

И третий раз. IDENTITY никогда не гаратировала непрерывной последовательности.
27 окт 14, 15:35    [16764049]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
aleks2
Guest
Паша01
Просто хочется знать причину такого поведения =)
Ещё только что кое-что заметил: использую команду
DBCC CHECKIDENT ('Issue');

и получаю разные со временем разные значения ID, хотя запись в таблицу не добавлена. Как можно посмотреть историю операций?


диапазон IDENTITY назначается на всю пачку при insert
и если insert откатится повторно не используется.

Так, чаще всего, и образуются разрывы.
27 окт 14, 16:14    [16764252]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Паша01
Просто хочется знать причину такого поведения =)
Ещё только что кое-что заметил: использую команду
DBCC CHECKIDENT ('Issue');

и получаю разные со временем разные значения ID, хотя запись в таблицу не добавлена. Как можно посмотреть историю операций?
Читайте внимательнее, вам iap уже дал ссылку выше. Сам наблюдал такое поведение 2012 сиквела при любом рестарте машины, независимо от его корректности.
27 окт 14, 16:35    [16764351]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Glory
Паша01
Просто хочется знать причину такого поведения =)

И третий раз. IDENTITY никогда не гаратировала непрерывной последовательности.


IDENTITY это уникальность , а не последовательность. Это генератор уникальных значений. Sequence -- это генератор последовательности. IDENTITY -- по-английски это уникальный, индивидуальный, однозначно определяющий.
27 окт 14, 16:43    [16764378]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
IDENTITY это уникальность , а не последовательность. Это генератор уникальных значений.

IDENTITY и уникальность не гарантирует.
27 окт 14, 16:45    [16764384]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
o-o
Guest
a_voronin
IDENTITY это уникальность , а не последовательность. Это генератор уникальных значений.


Because the SET option allows you to determine your own values for an IDENTITY column,
the IDENTITY property alone doesn’t enforce uniqueness of a value within the table.
27 окт 14, 16:52    [16764408]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
o-o,

Батенька, не вырывайте предложения из контекста. Это никак не меняет того, что identity изначально задумана для уникальности.

To temporarily disable the automatic generation of values in an identity column, you use the SET IDENTITY_INSERT tablename ON option. In addition to filling in gaps in the identity sequence, this option is useful for tasks such as bulk-loading data in which the previous values already exist. For example, perhaps you're loading a new database with customer data from your previous system. You might want to preserve the previous customer numbers but have new ones automatically assigned using IDENTITY. The SET option was created exactly for cases like this.
Because the SET option allows you to determine your own values for an IDENTITY column, the IDENTITY property alone doesn't enforce uniqueness of a value within the table. Although IDENTITY generates a unique number if IDENTITY_INSERT has never been enabled, the uniqueness is not guaranteed once you have used the SET option. To enforce uniqueness (which you'll almost always want to do when using IDENTITY), you should also declare a UNIQUE or PRIMARY KEY constraint on the column. If you insert your own values for an identity column (using SET IDENTITY_INSERT), when automatic generation resumes, the next value is the next incremented value (or decremented value) of the highest value that exists in the table, whether it was generated previously or explicitly inserted.
27 окт 14, 18:10    [16764685]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
o-o
Guest
действительно. не будем сокращать цитаты.
поищем вместе, было ли хоть что-то про "identity изначально задумана",
или же a_voronin утверждал уникальность identity?
a_voronin
Glory
пропущено...

И третий раз. IDENTITY никогда не гаратировала непрерывной последовательности.


IDENTITY это уникальность , а не последовательность. Это генератор уникальных значений. Sequence -- это генератор последовательности. IDENTITY -- по-английски это уникальный, индивидуальный, однозначно определяющий.

a_voronin
o-o,

Батенька, не вырывайте предложения из контекста. Это никак не меняет того, что identity изначально задумана для уникальности.

To temporarily disable the automatic generation of values in an identity column, you use the SET IDENTITY_INSERT tablename ON option. In addition to filling in gaps in the identity sequence, this option is useful for tasks such as bulk-loading data in which the previous values already exist. For example, perhaps you're loading a new database with customer data from your previous system. You might want to preserve the previous customer numbers but have new ones automatically assigned using IDENTITY. The SET option was created exactly for cases like this.
Because the SET option allows you to determine your own values for an IDENTITY column, the IDENTITY property alone doesn't enforce uniqueness of a value within the table. Although IDENTITY generates a unique number if IDENTITY_INSERT has never been enabled, the uniqueness is not guaranteed once you have used the SET option. To enforce uniqueness (which you'll almost always want to do when using IDENTITY), you should also declare a UNIQUE or PRIMARY KEY constraint on the column. If you insert your own values for an identity column (using SET IDENTITY_INSERT), when automatic generation resumes, the next value is the next incremented value (or decremented value) of the highest value that exists in the table, whether it was generated previously or explicitly inserted.

но ведь "немножко динамики" -- это вовсе не динамика.
в этом свете действительно, хотя IDENTITY и НЕ ГАРАНТИРУЕТ УНИКАЛьНОСТь, это ни что иное, как уникальность.

P.S. именно uniqueness на английском -- уникальность, а не identity

P.P.S. как насчет "выдергивания из контекста"?
у меня в цитате действительно не упомянута эта опция? или НЕЧИТАТЕЛь вновь не видит?
o-o
a_voronin
IDENTITY это уникальность , а не последовательность. Это генератор уникальных значений.


Because the SET option allows you to determine your own values for an IDENTITY column,
the IDENTITY property alone doesn’t enforce uniqueness of a value within the table.


P.P.P.S.
a_voronin
+ при откате транзакции identity не откатывается -- появляется пробел.

create table dbo.t (id int identity);

begin tran
   insert into dbo.t default values;
   insert into dbo.t default values;
   insert into dbo.t default values;
   select * from dbo.t;
--- result:
--id
--1
--2
--3
rollback;

select * from dbo.t; 
---
id 
   

неужто identity откатились? о, ужас!
а пробел, -- он у кого-то в знаниях.
27 окт 14, 19:09    [16764901]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
o-o
неужто identity откатились? о, ужас!
а пробел, -- он у кого-то в знаниях.


Я смотрю, сегодня ваша очередь нести пургу. Что должен вернуть последний SELECT 1 или 4?

create table dbo.t (id int identity);

begin tran
   insert into dbo.t default values;
   insert into dbo.t default values;
   insert into dbo.t default values;
   select * from dbo.t;
--- result:
--id
--1
--2
--3
rollback;

insert into dbo.t default values;

select * from dbo.t; 

DROP TABLE dbo.t 


o-o
P.S. именно uniqueness на английском -- уникальность, а не identity


Вот английскому учить меня не надо. На курсах профессиональных переводчиков дают какую-нибудь фразу типа "work things out" или "express your identity" и просят сделать 20 разных правильных смысловых переводов. Ваша фраза "именно uniqueness на английском -- уникальность" для меня бред сивой кобылы. Вы даже наверное не знаете о сущестовании толковых словарей английского языка.
27 окт 14, 19:35    [16764993]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
a_voronin
o-o
P.S. именно uniqueness на английском -- уникальность, а не identity


Вот английскому учить меня не надо. На курсах профессиональных переводчиков дают какую-нибудь фразу типа "work things out" или "express your identity" и просят сделать 20 разных правильных смысловых переводов. Ваша фраза "именно uniqueness на английском -- уникальность" для меня бред сивой кобылы. Вы даже наверное не знаете о сущестовании толковых словарей английского языка.
Здесь профессиональный, технический форум. А гуманитарии, языковеды, профессиональные переводчики и прочие любители потрепаться ни о чем, могут идти в Просто треп

Есть четкое определение того, что такое уникальный ключ из теории реляционных баз данных. Так какое нафик значение имеет то, как вы решили что-то перевести в английском языке? Идентификатор (IDENTITY, хоть на английском, хоть на татарском) не обязан быть уникальным по определению. Посмотрите что-ли в словаре в чем разница между identifier и unique identifier.
27 окт 14, 20:55    [16765215]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
o-o
Guest
a_voronin
Я смотрю, сегодня ваша очередь нести пургу. Что должен вернуть последний SELECT 1 или 4?

a_voronin, пощадите, не взрывайте мозг окружающим
вы понимаете разницу между "откатить изменения" -- то, что и делает роллбэк:
In SQL, ROLLBACK is a command that causes all data changes since the last BEGIN WORK, or START TRANSACTION to be discarded by the relational database management systems (RDBMS), so that the state of the data is "rolled back" to the way it was before those changes were made.
и "переустановить текущее идентификационное значение в таблице" (reset identity)?
роллбэк откатывает все и вся. но не переустанавливает identity (rollback transaction does not reset identity)
и мораль примера была в этом.
конкретно на ваше
a_voronin
+ при откате транзакции identity не откатывается -- появляется пробел.
27 окт 14, 22:17    [16765466]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
o-o
a_voronin
Я смотрю, сегодня ваша очередь нести пургу. Что должен вернуть последний SELECT 1 или 4?

a_voronin, пощадите, не взрывайте мозг окружающим
вы понимаете разницу между "откатить изменения" -- то, что и делает роллбэк:
In SQL, ROLLBACK is a command that causes all data changes since the last BEGIN WORK, or START TRANSACTION to be discarded by the relational database management systems (RDBMS), so that the state of the data is "rolled back" to the way it was before those changes were made.
и "переустановить текущее идентификационное значение в таблице" (reset identity)?
роллбэк откатывает все и вся. но не переустанавливает identity (rollback transaction does not reset identity)
и мораль примера была в этом.
конкретно на ваше
a_voronin
+ при откате транзакции identity не откатывается -- появляется пробел.


Сегодня вы не в себе.

Я утверждал, что при откате транзакции появятся пробелы в последовательности. То есть значение не вернётся в предыдущее состояние. Привёл скрипт, где 1 2 3 пропускаются и становиться 4. Что вы мне пытаетесь доказать -- тоже самое, что я сказал с самого начала?

"роллбэк откатывает все и вся. но не переустанавливает identity (rollback transaction does not reset identity)" именно это я утверждал выше. Вопрос в том, что это вы стали гнать пургу пытаясь оспорить то, что я сказал, говоря тоже самое.
27 окт 14, 22:22    [16765486]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
o-o
Guest
a_voronin,

вы что, ПРАВДА НЕ ВИДИТЕ, ЧТО ОТКАТИЛИСь 3 СТРОКИ С IDENTITY?
ТАМ ДРУГИХ И ВОВСЕ НЕ БЫЛО!

еще раз: НЕ ПЕРЕУСТАНАВЛИВАЕТСЯ ЗНАЧЕНИЕ IDENTITY,
НО ОТКАТЫВАЮТСЯ ВСЕ ИЗМЕНЕНИЯ.
ВСЕ ВАШИ ВСТАВЛЕННЫЕ IDENTITY ОТКАТИЛИСь ЗА МИЛУЮ ДУШУ
27 окт 14, 22:48    [16765553]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
o-o
Guest
a_voronin
Я утверждал, что при откате транзакции появятся пробелы в последовательности.


как здорово, что на форуме невозможно корректировать собственную писанину, правда?
вы русским точно владеете?

a_voronin
+ при откате транзакции identity не откатывается -- появляется пробел.
27 окт 14, 22:53    [16765562]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
такой пример пойдет?

Паша01
Всем привет!
Но в последнее время айдишники почему-то перестали создаваться по порядку, а с прибавлением какого-то рандомного значения. Посмотрел в базе данных у первичного ключа свойство Identity specification, все норм, т.е. seed = 1 и increment = 1. В чем может быть дело?



CREATE FUNCTION dbo.fn_doc_usage_summary_department_groupbydate(@StartDate datetime, @EndDate datetime)
RETURNS @rst TABLE (
    dusd_gbd_dep_name nvarchar(128)             --- department name 
  , dusd_gbd_date    varchar(10)                --- yyyy or yyyy-mm or yyyy-mm-dd
  , ................................................
  , rownum int identity
)
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @dep_list  dbo.PairType
    DECLARE @job_list dbo.JobListType
    -- 1. ----------------------  list of cc used in queres
    INSERT INTO @dep_list( pair_id , pair_name )
      SELECT DISTINCT f.dep_id, dep.slnxdep_name 
        FROM dbo.fn_doc_usage_devicesInDepartments() f, dbo.slnx_department dep 
          WHERE f.dep_id=dep.slnxdep_id
    -- 2. ----------------------  list of jobs used in queres
    INSERT INTO @job_list ( pair_id, job_id, job_type, colorcount, bwcount, duplexflag, total, slnxjob_origcost, successflag, slnxjob_time, slnxuser_id, slnxuser_name )
      SELECT pair_id, job_id, job_type, colorcount, bwcount, duplexflag, total, slnxjob_origcost, successflag, slnxjob_time, slnxuser_id, slnxuser_name 
        FROM dbo.fn_get_joblist_data( @dep_list, @StartDate, @EndDate )

    DECLARE @global_total_pages int = ( SELECT SUM( COALESCE( total, 0 ) ) FROM @job_list )

    -- 3. ----------------------  initial agregation
    INSERT INTO @rst (dusd_gbd_dep_name, dusd_gbd_date, ... )
        SELECT g.pair_name, grouped_date, g.total_pages
        , (100 * ( CAST(g.total_pages AS float) / CAST(@global_total_pages AS float) )) AS prcnt
        FROM (
            SELECT pair_name                -- count total per cc
            , dbo.fn_get_year_month_day_part( j.slnxjob_time, @groupByDate ) AS grouped_date
            , SUM( COALESCE( j.total, 0 )) AS total_pages 
            , 0 AS global_total_pages                        -- Global total number pages per cost center
            FROM @dep_list c JOIN @job_list j ON (j.pair_id = c.pair_id)
            GROUP BY c.pair_name, dbo.fn_get_year_month_day_part( j.slnxjob_time, @groupByDate )
            ) g 
.................   
  RETURN
END
GO

OUTPUT:

Ardennes	2014-07-17   3
Ardennes 2014-07-18 11
Ardennes 2014-07-20 26
28 окт 14, 00:25    [16765716]     Ответить | Цитировать Сообщить модератору
 Re: Стали создаваться айдишники не по порядку  [new]
aleks2
Guest
o-o
a_voronin,

вы что, ПРАВДА НЕ ВИДИТЕ, ЧТО ОТКАТИЛИСь 3 СТРОКИ С IDENTITY?
ТАМ ДРУГИХ И ВОВСЕ НЕ БЫЛО!

еще раз: НЕ ПЕРЕУСТАНАВЛИВАЕТСЯ ЗНАЧЕНИЕ IDENTITY,
НО ОТКАТЫВАЮТСЯ ВСЕ ИЗМЕНЕНИЯ.
ВСЕ ВАШИ ВСТАВЛЕННЫЕ IDENTITY ОТКАТИЛИСь ЗА МИЛУЮ ДУШУ


Такой умный и такой бедный?
Ты вставляй то не в одом потоке. Хоть два запусти.

ЗЫ. Причем, при наличии мозга, даже запускать не надо.
а) первый вставил 3 шт
б) второй вставил 3 шт
в) первый откатился
г) Что должно делать identity,
28 окт 14, 05:01    [16765828]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить