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

Откуда:
Сообщений: 560
Всем, здравствуйте! Устраняя проблемы предыдущего программиста, пришлось добавить поле ID в таблицу, в которой 270500 записей. Заполняю поле в цикле значениями 1, 2, 3 и т.д., но процесс затянулся на многие часы. Подскажите как это поле можно заполнить быстрее, может есть встроенные инструменты.
23 дек 10, 08:44    [9985625]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Gennadiy83
Всем, здравствуйте! Устраняя проблемы предыдущего программиста, пришлось добавить поле ID в таблицу, в которой 270500 записей. Заполняю поле в цикле значениями 1, 2, 3 и т.д., но процесс затянулся на многие часы. Подскажите как это поле можно заполнить быстрее, может есть встроенные инструменты.


Указать его как identity.
23 дек 10, 08:46    [9985634]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
Gennadiy83
Member

Откуда:
Сообщений: 560
Верблюд
Gennadiy83
Всем, здравствуйте! Устраняя проблемы предыдущего программиста, пришлось добавить поле ID в таблицу, в которой 270500 записей. Заполняю поле в цикле значениями 1, 2, 3 и т.д., но процесс затянулся на многие часы. Подскажите как это поле можно заполнить быстрее, может есть встроенные инструменты.


Указать его как identity.


Огромное спасибо
23 дек 10, 10:17    [9986141]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30768
Gennadiy83
Верблюд
Указать его как identity.

Огромное спасибо
Только потом его нельзя будет заполнять нужными вам значениями.

И тогда кто-то другой будет "Устранять проблемы предыдущего программиста" :-)
23 дек 10, 15:37    [9988910]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
qwasdcvbtfhryj
Guest
Можно попробовать
update t
set id=tt.id
from YOUR_TABLE t
join (
    select row_number() over(partition by FIELD1 order by FIELD2) id, FIELD1, FIELD 
    from YOUR_TABLE
    ) tt on t.FIELD1=tt.FIELD1 and t.FIELD2=tt.FIELD2
Конечно, если есть уникальное поле FIELD2.
23 дек 10, 16:03    [9989118]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
qwasdcvbtfhryj
Можно попробовать
update t
set id=tt.id
from YOUR_TABLE t
join (
    select row_number() over(partition by FIELD1 order by FIELD2) id, FIELD1, FIELD 
    from YOUR_TABLE
    ) tt on t.FIELD1=tt.FIELD1 and t.FIELD2=tt.FIELD2
Конечно, если есть уникальное поле FIELD2.
Тогда уж
WITH CTE(id,n) AS (SELECT id,ROW_NUMBER()OVER(ORDER BY(SELECT 0)))
UPDATE CTE SET id=n;
Ибо порядок нумерации нам неведом...
23 дек 10, 16:08    [9989164]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
iap
Тогда уж
WITH CTE(id,n) AS (SELECT id,ROW_NUMBER()OVER(ORDER BY(SELECT 0)))
UPDATE CTE SET id=n;
Ибо порядок нумерации нам неведом...
Ошибся. Опять FROM забыл!
WITH CTE(id,n) AS (SELECT id,ROW_NUMBER()OVER(ORDER BY(SELECT 0))FROM [Таблица])
UPDATE CTE SET id=n;
23 дек 10, 16:09    [9989175]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
qwasdcvbtfhryj
Guest
iap,

А что, манипуляции с объектом CTE(id,n) скажутся на [Таблица]?
23 дек 10, 16:12    [9989203]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
iap
Member

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

А что, манипуляции с объектом CTE(id,n) скажутся на [Таблица]?
А Вы попробуйте!
Вообще-то, CTE - это не объект в традиционном понимании.
Скорее, похоже на виртуальное представление.
23 дек 10, 16:22    [9989297]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
pasha701
Member

Откуда: Дніпропетровськ
Сообщений: 231
DECLARE @id int
SET @id = 0
Update YOUR_TABLE
Set ID_FIELD=@id,
      @id=@id+1
23 дек 10, 17:11    [9989660]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
-=FlinT=-
Member

Откуда:
Сообщений: 91
pasha701
DECLARE @id int
SET @id = 0
Update YOUR_TABLE
Set ID_FIELD=@id,
      @id=@id+1

Когда-то меня на этом форуме больно отпинали ногами за подобный подход. В общем, юзать такой UPDATE не рекомендуется :)
23 дек 10, 17:15    [9989685]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
Xordal
Member

Откуда: Таганрог
Сообщений: 536
ALTER TABLE <table name> ALTER COLUMN <column name> int identity (1,1) NOT NULL
а
pasha701
DECLARE @id int
SET @id = 0
Update YOUR_TABLE
Set ID_FIELD=@id,
      @id=@id+1

реально какое-то стремное решение
23 дек 10, 17:40    [9989883]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
qwasdcvbtfhryj
Guest
Xordal,

Ну, добавите вы новую колонку в таблицу. А данные где взять?
23 дек 10, 17:47    [9989941]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Xordal
ALTER TABLE <table name> ALTER COLUMN <column name> int identity (1,1) NOT NULL
Ну ведь сказали же, что это сразу лишает возможности нормально вставлять произвольные значения
и тем более менять их впоследствии
23 дек 10, 17:48    [9989944]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
qwasdcvbtfhryj
Xordal,

Ну, добавите вы новую колонку в таблицу. А данные где взять?
Колонка IDENTITY заполняется сервером автоматически
23 дек 10, 17:48    [9989953]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
Xordal
Member

Откуда: Таганрог
Сообщений: 536
iap
Xordal
ALTER TABLE <table name> ALTER COLUMN <column name> int identity (1,1) NOT NULL
Ну ведь сказали же, что это сразу лишает возможности нормально вставлять произвольные значения
и тем более менять их впоследствии

Что мешает потом поменять тип на int, религия? Человеку надо заполнить максимально быстро колонку уникальными значениями.
ALTER TABLE <table name> ALTER COLUMN <column name> int identity (1,1) NOT NULL
GO
ALTER TABLE <table name> ALTER COLUMN <column name> int NOT NULL
GO
либо если колонка еще не создана:
ALTER TABLE <table name> ADD ID int identity (1,1) NOT NULL
GO
ALTER TABLE <table name> ALTER COLUMN ID int NOT NULL
GO
23 дек 10, 18:04    [9990072]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
pasha701
Member

Откуда: Дніпропетровськ
Сообщений: 231
-=FlinT=-
Когда-то меня на этом форуме больно отпинали ногами за подобный подход...
Сейчас посмотрел https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=781017&hl=, особых протестов не нашел. Если порядок не важен, можно и так.
23 дек 10, 18:13    [9990145]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
iljy
Member

Откуда:
Сообщений: 8711
Xordal
ALTER TABLE <table name> ALTER COLUMN <column name> int identity (1,1) NOT NULL
GO
ALTER TABLE <table name> ALTER COLUMN <column name> int NOT NULL
GO
либо если колонка еще не создана:
ALTER TABLE <table name> ADD ID int identity (1,1) NOT NULL
GO
ALTER TABLE <table name> ALTER COLUMN ID int NOT NULL
GO
А вы сами вообще пробовали так делать?
use tempdb
if object_ID('#ttt','U') is not null drop table #ttt
go
create table #ttt(id int identity, val int)

alter table #ttt alter column id int not null

select name, is_identity from sys.columns
where object_id = OBJECT_ID('#ttt','U')

drop table #ttt
Результат
name	is_identity
id 1
val 0
А так
alter table #ttt alter column id int identity not null
вообще ошибку получите
автор
Msg 156, Level 15, State 1, Line 3
Неправильный синтаксис около ключевого слова "identity".

Нельзя поменять у поля свойство identity. Можно только его удалить и создать новое.
23 дек 10, 18:25    [9990223]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
iljy
Member

Откуда:
Сообщений: 8711
pasha701,

тогда уж проще так
DECLARE @id int
SET @id = 0
Update YOUR_TABLE
Set @id = ID_FIELD=@id+1
Но это все возможно только если не важен порядок.
23 дек 10, 18:28    [9990236]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
qwasdcvbtfhryj
Guest
Но можно в SSMS удалить свойство identity у поля.
23 дек 10, 18:36    [9990290]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
iljy
Member

Откуда:
Сообщений: 8711
qwasdcvbtfhryj
Но можно в SSMS удалить свойство identity у поля.

Ага, а слабо жамкнуть на кнопочку "Создать сценарий изменения" и посмотреть, что же там происходит на самом деле?
23 дек 10, 18:39    [9990310]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
qwasdcvbtfhryj
Guest
Очевидно, елается через временные таблицы. Зато самому не надо заморачиваться, все сделает SSMS.
23 дек 10, 18:41    [9990325]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
iljy
Member

Откуда:
Сообщений: 8711
qwasdcvbtfhryj
Очевидно, елается через временные таблицы. Зато самому не надо заморачиваться, все сделает SSMS.
ага, на таблице во много миллионов записей это будет ахрененно круто
23 дек 10, 18:43    [9990334]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
создате себе таблицу счетчик,для каждой сущности и узаете пока не надоест ....

моя непонимать ....
23 дек 10, 18:43    [9990336]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро заполнить поле ID  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iljy
qwasdcvbtfhryj
Очевидно, елается через временные таблицы. Зато самому не надо заморачиваться, все сделает SSMS.
ага, на таблице во много миллионов записей это будет ахрененно круто


ваще править талицы через гуй - ето крута :) Ето верних пилотаж..ровно как и соберать селекты контрукторами
23 дек 10, 18:44    [9990343]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить