Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 второй identity в таблице  [new]
вопросецttt
Guest
Коллеги,
подскажите пожалуйста как реализовать такое в SQL версии 2012.

Есть таблица, у который основной первичный ключ id bigint not null, и по которому настроено Identity. В таблице есть поле row_id int not null, по которому тоже надо настроить некое подобие identity.

Вопрос немного глупый, связан с некорректной структурой таблицы, но такую структуру необходимо поддерживать из-за совместимости с прежними версиями ПО.
10 сен 14, 15:45    [16560008]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9683
вопросецttt
В таблице есть поле row_id int not null, по которому тоже надо настроить некое подобие identity.
sequence
10 сен 14, 15:46    [16560023]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+

create table q1(id int identity(1, 1) not null);
go

insert into q1 default values;
go 5

alter table q1 add row_id as id
go

select *
from
	q1;
go
10 сен 14, 16:00    [16560108]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
вопросецttt
Guest
invm,

точно. Спасибо огромное!
10 сен 14, 16:03    [16560136]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
вопросецttt
Guest
churupaha,

Все бы хорошо, но id имеет тип bigint, а row_id - int
10 сен 14, 16:03    [16560144]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37198
вопросецttt
churupaha,

Все бы хорошо, но id имеет тип bigint, а row_id - int

alter table q1 add row_id as cast (id as int)
?

Сообщение было отредактировано: 10 сен 14, 16:10
10 сен 14, 16:09    [16560183]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
вопросецttt
Guest
Гавриленко Сергей Алексеевич,

в вашем примере я:
а. получу ошибку конвертации
б. если обрежу bigint до int, то не получу уникального значения
10 сен 14, 18:00    [16560948]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
вопросецttt
б. если обрежу bigint до int, то не получу уникального значения


Зависит от того как обрезать, очевидно.
Если в Вашем ID получаются такие "пробелы", что младшие 4 байта не дают уникальности - то никакое Identity на типе Int вам не поможет, поскольку пробелы там будут ровно те же.
10 сен 14, 18:06    [16560982]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
вопросецttt
Guest
Кот Матроскин
вопросецttt
б. если обрежу bigint до int, то не получу уникального значения


Зависит от того как обрезать, очевидно.
Если в Вашем ID получаются такие "пробелы", что младшие 4 байта не дают уникальности - то никакое Identity на типе Int вам не поможет, поскольку пробелы там будут ровно те же.


Ну, это уже другой вопрос (к извращенности такой схемы). Я же могу ведь держать в bigint значение достаточно большое, например -9223372036854775808. А в row_id будет записано –2147483648.
11 сен 14, 17:46    [16565398]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
вопросецttt,

bigint 8 байт
int 4 байт

предположим, у вас в таблице строк на один больше чем помещается в разрядную сетку int? bigint позволит, а в int что вы запишите, повтор?
11 сен 14, 17:54    [16565432]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
вопросецttt
Кот Матроскин
пропущено...


Зависит от того как обрезать, очевидно.
Если в Вашем ID получаются такие "пробелы", что младшие 4 байта не дают уникальности - то никакое Identity на типе Int вам не поможет, поскольку пробелы там будут ровно те же.


Ну, это уже другой вопрос (к извращенности такой схемы). Я же могу ведь держать в bigint значение достаточно большое, например -9223372036854775808. А в row_id будет записано –2147483648.


Еще раз - что будет записано в row_id, зависит от формулы "обрезания". Если применять формулу "младшие 4 байта" (т.е. остаток от деления на 2^32) - то проблема с уникальностью возникнет только если Identity на 4-байтном целом вообще не может быть применено на этой таблице.
11 сен 14, 18:04    [16565469]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
вопросецttt
Guest
Кот Матроскин,

Т.е. вы предлагаете такую конвертацию:

select id1, cast(cast(id1 as varbinary(8)) as int) as id from table
11 сен 14, 18:15    [16565510]     Ответить | Цитировать Сообщить модератору
 Re: второй identity в таблице  [new]
Crimean
Member

Откуда:
Сообщений: 13147
вопросецttt,

id1 & 0xFFFFFFFF проще :)
11 сен 14, 18:45    [16565606]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить