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

Откуда: Бобруйск
Сообщений: 334
подскажите пожалуйста, можно ли создать таблицу с двумя инкриминируемыми полями??

create table ident_ind2 (id numeric(10) identity, number varchar(50), numb numeric(10) identity )

Msg 2744, Level 16, State 2, Line 1
Multiple identity columns specified for table 'ident_ind2'. Only one identity column per table is allowed.


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

есть варианты обойти ограничение наложенное сервером?
при том что у меня пного пользовательская БД. и записи могут вставляться пачками и разными пользюками.
спасибо
20 дек 11, 14:07    [11796350]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Двоичник,

зачем два IDENTITY в одной таблице? Объясните, пожалуйста.
20 дек 11, 14:10    [11796397]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Glory
Member

Откуда:
Сообщений: 104751
Двоичник
подскажите пожалуйста, можно ли создать таблицу с двумя инкриминируемыми полями??

Нет

Двоичник
есть варианты обойти ограничение наложенное сервером?

Нет

Двоичник
чтобы оно было автоматически инкрименируемым начиная с определенного значения и было уникально (за вычетом существующих нуллов)

identity не обеспичивает уникальности
20 дек 11, 14:11    [11796404]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
iap
Двоичник,

зачем два IDENTITY в одной таблице? Объясните, пожалуйста.


один идентити для форенкея, второй для формирования сущности, номер документа.
20 дек 11, 14:11    [11796410]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Двоичник
iap
Двоичник,

зачем два IDENTITY в одной таблице? Объясните, пожалуйста.


один идентити для форенкея, второй для формирования сущности, номер документа.
Они разные должны быть?
20 дек 11, 14:15    [11796451]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
хорошо, два идентити нельзя
спрошу подругому - как можно сделать автоматически инкрименируемое поле, если не механизмом идентити, то хотябы тригером, чтобы можно было сохранить уникальность генерируемого поля разными коннектами к бд???
неужто придется клеить другую таблу с идентити???
Глори, почему не обеспечивает уникальности? есть пример когда идентити не уникален??
20 дек 11, 14:16    [11796460]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
baracs
Двоичник
пропущено...


один идентити для форенкея, второй для формирования сущности, номер документа.
Они разные должны быть?


да разные...

на настоящий табла содержит 18 млн записей. нужно сделать к новым записям автоматически генерируемое поле номер документа, начиная с 20000000 и продолжить генерить его уникально, и хранить как сущность.
20 дек 11, 14:17    [11796487]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Двоичник
iap
Двоичник,

зачем два IDENTITY в одной таблице? Объясните, пожалуйста.


один идентити для форенкея, второй для формирования сущности, номер документа.
Любые IDENTITY? сколько бы их ни было,
можно было бы вычислить из одного.
Правда?
И смысла в этом мало.

Поверьте моему опыту:
1. Номер документа надо делать строковым, ибо Вас, по всей видимости, заставят-таки прибавить суффикс, префикс, тире и т.п.
Кроме того, входящие документы уже имеют номер, не обязательно числовой, который нельзя менять.
2. IDENTITY не предназначен для нумерации. Его, например, нельзя апдейтить. и много других нюансов.
20 дек 11, 14:18    [11796496]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Двоичник
хорошо, два идентити нельзя
спрошу подругому - как можно сделать автоматически инкрименируемое поле, если не механизмом идентити, то хотябы тригером, чтобы можно было сохранить уникальность генерируемого поля разными коннектами к бд???
неужто придется клеить другую таблу с идентити???
Глори, почему не обеспечивает уникальности? есть пример когда идентити не уникален??
USE tempdb;
SET NOCOUNT ON;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
GO
CREATE TABLE T(ID INT NOT NULL IDENTITY);
GO
INSERT T DEFAULT VALUES;
SET IDENTITY_INSERT T ON;
INSERT T(ID) VALUES(1);
INSERT T(ID) VALUES(1);
INSERT T(ID) VALUES(1);
INSERT T(ID) VALUES(1);
INSERT T(ID) VALUES(1);
SET IDENTITY_INSERT T OFF;
SELECT * FROM T;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
20 дек 11, 14:23    [11796552]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Двоичник
хорошо, два идентити нельзя
спрошу подругому - как можно сделать автоматически инкрименируемое поле, если не механизмом идентити, то хотябы тригером, чтобы можно было сохранить уникальность генерируемого поля разными коннектами к бд???
Нифига не понятно
Двоичник
Глори, почему не обеспечивает уникальности? есть пример когда идентити не уникален??
Генерить уникальные значения и обеспечивать уникальность - это разные вещи.
Гарантируют уникальность значений колонки UNIQUE CONSTRAINT или уникальный индекс.
20 дек 11, 14:25    [11796590]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
iap,

уважаемый, вы читали текст моего призыва о помощи?
я разве просил предусмотреть возможность добавлять в номер документа тире и префиксы? ГУИД или блоб?
ну что вы в самом деле...
гипотетически предствьте сбе что это номер паспорта - и я точно знаю что там не может быть тире и чорточек. и апдейтить мне не надо это поле.
я уверен в этом.
и еще, яп, зачем вы мне привели в пример скрипт отключения идентити при инсерте???
я отвечаю на уникальность этогополя и мне за нее отвечать??

почему, все чаще и чаще, задавая вопрос на этом форму я получаю ответ не о том как это сделать, а указатели почему мне так не нада делать??
спасибо
20 дек 11, 14:29    [11796641]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Двоичник,

дружочек, одно слово "уважаемый" в качестве обращения - это в некотором роде оскорбление, вообще-то.
Как там с русским разговорным? Всё нормально?

Кто там просил пример неуникального IDENTITY, а? Или мне почудилось?
Считаю теперь, что нет такого пользователя - "Двоичник". Помер.

Пожалуйста!
20 дек 11, 14:35    [11796693]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Двоичник
инкриминируемыми
Инкриминируются нарушения и преступления. А поля инкрементируются.
20 дек 11, 14:37    [11796722]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Двоичник
iap,

уважаемый, вы читали текст моего призыва о помощи?
я разве просил предусмотреть возможность добавлять в номер документа тире и префиксы? ГУИД или блоб?
ну что вы в самом деле...
гипотетически предствьте сбе что это номер паспорта - и я точно знаю что там не может быть тире и чорточек. и апдейтить мне не надо это поле.
я уверен в этом.
и еще, яп, зачем вы мне привели в пример скрипт отключения идентити при инсерте???
я отвечаю на уникальность этогополя и мне за нее отвечать??

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

Используйте последовательности. Конечно в MSSQL их пока нет (с 2011 появятся), но вот скрипт создания и использования последовательности.
+ Реализация Sequence
----------------------
if OBJECT_ID(N'dbatools.sequence',N'U') is not null
	drop table dbatools.sequence
go

create table dbatools.sequence(
sequence_name sysname not null,
sequence_start bigint not null,
sequence_step bigint not null,
sequence_current_value bigint not null,
constraint PK_sequence_1 primary key (sequence_name)
)
go

grant select on dbatools.sequence to public;
go

/**********************************
EXAMPLE

ADD 
 exec dbatools.sp_add_sequence
	@sequence_name = N'MySequence',
	@sequence_start = 10,
	@sequence_step =10
	
DELETE
 exec dbatools.sp_drop_sequence
 @sequence_name = N'MySequence'
 
GET_NEW_VALUE
 declare @seq bigint = 0;
 exec dbatools.sp_next_value_sequence
		@sequence_name = N'MySequence',
		 @new_value =@seq  output
 print @seq
***********************************/

if OBJECT_ID(N'dbatools.sp_add_sequence','P') is not null
	drop procedure dbatools.sp_add_sequence
go
create procedure dbatools.sp_add_sequence(
	@sequence_name sysname,
	@sequence_start bigint = 1,
	@sequence_step bigint = 1
)
as
begin
 insert into dbatools.sequence (sequence_name,sequence_start,sequence_step,sequence_current_value)
 values (@sequence_name,@sequence_start,@sequence_step,@sequence_start-@sequence_step);
end;
go

if OBJECT_ID(N'dbatools.sp_drop_sequence',N'P') is not null
	drop procedure dbatools.sp_drop_sequence
go

create procedure dbatools.sp_drop_sequence(
	@sequence_name sysname
)
as
begin
 delete from dbatools.sequence 
	where sequence_name = @sequence_name;
end;
go

if OBJECT_ID(N'dbatools.sp_next_value_sequence',N'P') is not null
	drop procedure dbatools.sp_next_value_sequence
go

create procedure dbatools.sp_next_value_sequence(
	@sequence_name sysname,
	@new_value bigint output 	
	)
as
begin
 update dbatools.sequence 
	set @new_value = sequence_current_value = sequence_current_value + sequence_step
 where sequence_name = @sequence_name;
end;
go

grant execute on dbatools.sp_next_value_sequence to public;
go

Вы будете получать каждый раз уникальное число.
А вообще прислушайтесь к людям, дурного не посоветуют.
20 дек 11, 14:38    [11796748]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
iap,

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

так что извиняюсь за не сдержанность и спасибо за подводные камни на опережение.
20 дек 11, 14:50    [11796897]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Glory
Member

Откуда:
Сообщений: 104751
Двоичник
я вижу задачу со своей колокольни и понимаю что с форенкеем уникальность таки будет имеет место быть.

Еще раз
Уникальность обеспечивают только специальные ограничения уникальности

Двоичник
и вставку с отключением инкримента я делать не собирался.

А DBCC CHECKIDENT ?
20 дек 11, 14:53    [11796934]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Glory
Member

Откуда:
Сообщений: 104751
Двоичник
почему, все чаще и чаще, задавая вопрос на этом форму я получаю ответ не о том как это сделать, а указатели почему мне так не нада делать??

Может потому, что вот так и не надо делать ?
20 дек 11, 14:54    [11796946]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
gds
Двоичник
iap,

уважаемый, вы читали текст моего призыва о помощи?
я разве просил предусмотреть возможность добавлять в номер документа тире и префиксы? ГУИД или блоб?
ну что вы в самом деле...
гипотетически предствьте сбе что это номер паспорта - и я точно знаю что там не может быть тире и чорточек. и апдейтить мне не надо это поле.
я уверен в этом.
и еще, яп, зачем вы мне привели в пример скрипт отключения идентити при инсерте???
я отвечаю на уникальность этогополя и мне за нее отвечать??

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

Используйте последовательности. Конечно в MSSQL их пока нет (с 2011 появятся), но вот скрипт создания и использования последовательности.
+
+ Реализация Sequence
----------------------
if OBJECT_ID(N'dbatools.sequence',N'U') is not null
	drop table dbatools.sequence
go

create table dbatools.sequence(
sequence_name sysname not null,
sequence_start bigint not null,
sequence_step bigint not null,
sequence_current_value bigint not null,
constraint PK_sequence_1 primary key (sequence_name)
)
go

grant select on dbatools.sequence to public;
go

/**********************************
EXAMPLE

ADD 
 exec dbatools.sp_add_sequence
	@sequence_name = N'MySequence',
	@sequence_start = 10,
	@sequence_step =10
	
DELETE
 exec dbatools.sp_drop_sequence
 @sequence_name = N'MySequence'
 
GET_NEW_VALUE
 declare @seq bigint = 0;
 exec dbatools.sp_next_value_sequence
		@sequence_name = N'MySequence',
		 @new_value =@seq  output
 print @seq
***********************************/

if OBJECT_ID(N'dbatools.sp_add_sequence','P') is not null
	drop procedure dbatools.sp_add_sequence
go
create procedure dbatools.sp_add_sequence(
	@sequence_name sysname,
	@sequence_start bigint = 1,
	@sequence_step bigint = 1
)
as
begin
 insert into dbatools.sequence (sequence_name,sequence_start,sequence_step,sequence_current_value)
 values (@sequence_name,@sequence_start,@sequence_step,@sequence_start-@sequence_step);
end;
go

if OBJECT_ID(N'dbatools.sp_drop_sequence',N'P') is not null
	drop procedure dbatools.sp_drop_sequence
go

create procedure dbatools.sp_drop_sequence(
	@sequence_name sysname
)
as
begin
 delete from dbatools.sequence 
	where sequence_name = @sequence_name;
end;
go

if OBJECT_ID(N'dbatools.sp_next_value_sequence',N'P') is not null
	drop procedure dbatools.sp_next_value_sequence
go

create procedure dbatools.sp_next_value_sequence(
	@sequence_name sysname,
	@new_value bigint output 	
	)
as
begin
 update dbatools.sequence 
	set @new_value = sequence_current_value = sequence_current_value + sequence_step
 where sequence_name = @sequence_name;
end;
go

grant execute on dbatools.sp_next_value_sequence to public;
go

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



спасибо за пример... это в общем таблица сбоку. я понял что других вариантов нет. спасибо всем
20 дек 11, 14:56    [11796967]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Двоичник
я понял что других вариантов нет. спасибо всем
вариант только триггером
20 дек 11, 15:19    [11797229]     Ответить | Цитировать Сообщить модератору
 Re: инкриинируемые поля  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
вычисляемое поле с ранжирующими функциями чем не вариант?
20 дек 11, 15:47    [11797548]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить