Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2016, 13:19   #1
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию ALTER TABLE ADD, 3М+ записей

Приветствую.

У меня возникла задачка: добавить в существующую таблицу поле, у которого должно быть default-значение.
В таблице, как понятно из заголовка, больше 3М записей, на что я и напоролся, попробовав это сделать "в тупую", через
Код:
ALTER TABLE tbl ADD (fieldname CHAR(1) DEFAULT 0)
Собственно время ожидания выполнения инструкции предполагалось больше двух часов (и блокировка таблицы на это же время), поэтому пришлось остановить её и создать столбец без значения по-умолчанию, так:
Код:
ALTER TABLE tbl ADD (fieldname CHAR(1))
Эта процедура отработала за 3 секунды.

Сейчас мне нужно все же прикрутить значение по-умолчанию к этому столбцу, плюс прописать default во всех уже существующих записях.
Варианты прикручивания:
1. В лоб - ИМХО тупиковый путь, займет ОЧЕНЬ много времени
2. Модификация пути "в лоб", примерно так:
Код:
ALTER TABLE tbl MODIFY
   (
   fieldname CHAR(1) DEFAULT 0 NOT NULL)
говорят оно работает быстрее - но проверять на имеющейся базе не стоит.
3. Перенос через "временную таблицу" - создаю табличку нужной структуры, переношу в неё данные, удаляю старую, переименовываю новую. Тоже не особо приятный вариант, главным образом из-за тех же временных затрат.

Для прописывания значения в имеющихся записях единственный вариант, который более-менее проходит, это курсор с коммитом изменений через каждые 10к (например) строк.

Можете посоветовать какие-то еще варианты?
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 25.06.2016, 13:34   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

просто update tbl set fieldname = 0, чем не устроил?
come-on вне форума Ответить с цитированием
Старый 25.06.2016, 13:36   #3
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
2. Модификация пути "в лоб", примерно так:
Код:

ALTER TABLE tbl MODIFY
(
fieldname CHAR(1) DEFAULT 0 NOT NULL)

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

вобще почему сразу так не делать. в чем смысл делать поле нул с умолчанием?

Последний раз редактировалось come-on; 25.06.2016 в 13:54.
come-on вне форума Ответить с цитированием
Старый 25.06.2016, 14:56   #4
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Цитата:
просто update tbl set fieldname = 0, чем не устроил?
Блокировка всей таблицы до тех пор, пока не выполнится присвоение.
Цитата:
ну боитесь на рабочей сделайте бекап потом новую восстановите и пробуйте
Пока что начальство не одобрило таких действий.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 25.06.2016, 15:12   #5
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

а с таблицей так сделать оно не возражает, да еще на боевой базе.. ну что то както сильно не похоже на правду))

попробовать можно так
;with x as (
select * from tbl with(nolock)
) update x set fieldname =0


а вы пробовали сразу создать поле с не нул и дефаултом?
come-on вне форума Ответить с цитированием
Старый 25.06.2016, 15:17   #6
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

либо порциями обновлять, через оффсет а не курсором

и почему чар(1) с дефаул = 0 ?

Последний раз редактировалось come-on; 25.06.2016 в 15:20.
come-on вне форума Ответить с цитированием
Старый 25.06.2016, 15:56   #7
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Цитата:
а вы пробовали сразу создать поле с не нул и дефаултом?
Пока что нет.
Цитата:
и почему чар(1) с дефаул = 0 ?
Тяжелое наследство прошлых веков =)

Мой вопрос можно сформулировать так:
У кого какой опыт есть по изменению таблиц с большим количеством записей, и кто что может посоветовать?
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Add string list with all user meta in wp-e commerce Custom Fields like wordpress default add/edit post/page admin panel Alar WordPress и другие CMS 1 11.03.2012 01:11
нужна одно table где все rows from table 1 но и еще добавленных table 2 Why Помощь студентам 0 20.09.2010 10:29
Поиск "почти" одинаковых записей в Table хИринах Помощь студентам 1 22.06.2010 09:19
alter table Neymexa SQL, базы данных 2 25.03.2010 17:51
alter table in ms sql Neymexa Помощь студентам 0 25.03.2010 14:29