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

Откуда:
Сообщений: 28
Есть таблица. 100 000 записей. Поле id везде null. Есть простой способ пронумеровать поле id?

Можно конечно копировать таблицу в "такую же" (+ один новый столбец id2), но где поле id2 с автоинкрементом. Убить старый столбец id и переименовать таблицу, но ... может можно как то проще?
16 мар 06, 14:47    [2456119]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
если есть уникальный ключ, можно и по другому, а так только как вы сказали
16 мар 06, 14:51    [2456147]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
zem
Member

Откуда:
Сообщений: 28
уникального ключа к сожалению нет, а если бы был?
16 мар 06, 14:52    [2456155]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
Брюлик
Member

Откуда:
Сообщений: 690
alter table yourtable add idcol int identity(1,1)
16 мар 06, 14:53    [2456158]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
zem
Можно конечно копировать таблицу в "такую же" (+ один новый столбец id2)
Зачем ещё то один? Делаете новую таблицу с идентити, вливаете в неё все колонки из старой кроме id, грохаете старую таблицу, переименовываете новую.
16 мар 06, 14:53    [2456161]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

а зачем, собственно, промежуточная таблица?
create table #tmp (id int, f1 int)

insert into #tmp (f1) values (34)
insert into #tmp (f1) values (55)
insert into #tmp (f1) values (98)

select * from #tmp

alter table #tmp drop column id
go
alter table #tmp add id int identity(1, 1)
go

select * from #tmp



Posted via ActualForum NNTP Server 1.3

16 мар 06, 15:04    [2456227]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
zem
Member

Откуда:
Сообщений: 28
daw, еще раз спасибо, это то что нужно
16 мар 06, 15:40    [2456404]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
tpg
zem
Можно конечно копировать таблицу в "такую же" (+ один новый столбец id2)
Зачем ещё то один? Делаете новую таблицу с идентити, вливаете в неё все колонки из старой кроме id, грохаете старую таблицу, переименовываете новую.

А нах такой геморрой,
удаляете это поле (там всё равно везде нулл), и создаёте новое поле (уже с идентити) с таким же названием, и всё.
16 мар 06, 15:41    [2456409]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
вариант с изменением таблицы будет потреблять столько же ресурсов сколько и с созданием новой. Однако в случае новой таблицы можно проконтролировать порядок записей.
16 мар 06, 16:26    [2456627]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
to zem:
и учтите, что св-во Identity просто так потом удалить не получится.
16 мар 06, 16:27    [2456632]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
KGP
Member

Откуда: Москва
Сообщений: 4554
saint
to zem:
и учтите, что св-во Identity просто так потом удалить не получится.


зато добавить новый столбец, скопировать туда данные из colid и грохнуть colid получится.

to zem: проектирование БД - не пустой звук.
16 мар 06, 16:32    [2456662]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
to KGP:
ага, только вот все данные придется перекачать с одной части винта на другую плюс в лог записать.
16 мар 06, 16:41    [2456715]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
KGP
Member

Откуда: Москва
Сообщений: 4554
saint
to KGP:
ага, только вот все данные придется перекачать с одной части винта на другую плюс в лог записать.


ИМХО: если ошибка в проектировании правиться 30 минутной работой админа, то админ приступает немедленно к этой работе.
16 мар 06, 17:00    [2456834]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
DROP TABLE t1
CREATE TABLE t1(c1 INT NULL, c2 INT)
GO
INSERT INTO t1 VALUES (NULL, 10)
INSERT INTO t1 VALUES (NULL, 10)
INSERT INTO t1 VALUES (NULL, 10)
INSERT INTO t1 VALUES (NULL, 10)
INSERT INTO t1 VALUES (NULL, 10)
INSERT INTO t1 VALUES (NULL, 10)
INSERT INTO t1 VALUES (NULL, 20)
INSERT INTO t1 VALUES (NULL, 30)
INSERT INTO t1 VALUES (NULL, 40)
INSERT INTO t1 VALUES (NULL, 50)
INSERT INTO t1 VALUES (NULL, 60)
go
SELECT * FROM T1
GO
DECLARE abc CURSOR LOCAL FOR
SELECT * FROM t1

OPEN abc
DECLARE @I int, @c1 int
SET @I = 1
FETCH abc 
WHILE @@FETCH_STATUS=0 BEGIN
  UPDATE t1 SET c1=@i
  FROM t1
  WHERE CURRENT OF abc
  SET @I = @I+1
FETCH abc 
END
CLOSE abc
GO
select * from t1
Мальца модифицированный пример из BOL
16 мар 06, 18:22    [2457339]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
DROP TABLE можно не запускать сразу. ;)
16 мар 06, 18:23    [2457340]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
PS Фирма не отвечает за немеряный сетевой траффик. ;)
16 мар 06, 18:24    [2457346]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
IMHO, вариант с курсором будет тормозить гораздо сильнее, чем даже

CREATE T2 с IDENTITY
INSERT T2 SELECT FROM T1
Truncate T1
INSERT T1 SELECT from T2
DROP T2

Хотя пускай будет в кач-ве экспоната ;-)
16 мар 06, 18:46    [2457436]     Ответить | Цитировать Сообщить модератору
 Re: Забыли поставить автоинкремент а айдишнике...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Timon
А нах такой геморрой,
удаляете это поле (там всё равно везде нулл), и создаёте новое поле (уже с идентити) с таким же названием, и всё.
Неужели вы думаете, что так серверу будет меньше работы? Добавляет столбец, апдейтит все строки (и скорее всего с реорганизацией страниц). Конечно, если табличка о паре колонок, то может и можно согласится... Но, всё равно, надо сильно сильно подумать, штоп так делать.
17 мар 06, 06:36    [2458289]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить