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

Откуда: Москва
Сообщений: 46951
Shakill
iap
У меня выдаёт это:пропущено...
Да, это лишь предупреждение.
Но оно означает, что более 900 байт туда не вставишь.

но индекс-то на поле varchar(5000) создан другое дело, что толку мало
Строго говоря, да.
14 сен 11, 14:54    [11275920]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
CoolMind
Member [заблокирован]

Откуда: Вологда
Сообщений: 4122
Всем спасибо, операция действительно прошла за доли секунды.
Правда, ввести символов больше не даёт интерфейс, и я думаю, дело в сознательном ограничении ввода в компоненте TextBox программы (к СУБД отношения уже не имеет).
15 сен 11, 08:05    [11278764]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Горе шкодер)))
Guest
Тоже столкнулся с такой проблемой, но все более запущено.
Имеем Microsoft SQL Server 2008 R2 - 10.50.1600.1 (X64). Есть таблица (назовем ее "mytable") с миллионами записей и в ней нужно увеличить размер ключевого (гыгы - так сделали до меня) поля (назовем его "id_field) с varchar(8) до varchar(14) с сохранением всех данных и связей. В итоге нужно написать запрос, который сам все корректно и быстро сделает на удаленном сервере.
Запрос
alter table dbo.mytable alter column id_field char(14)

разумеется возвращает ошибку:
Сообщение 5074, уровень 16, состояние 1, строка 1
The object 'PK_mytable' is dependent on column 'id_field'.
Сообщение 4922, уровень 16, состояние 9, строка 1
ALTER TABLE ALTER COLUMN id_field failed because one or more objects access this column.

Что посоветуете -сначала удалить все связи, потом выполнить Alter и снова создать связи?
4 июн 12, 16:21    [12662825]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Glory
Member

Откуда:
Сообщений: 104764
Горе шкодер)))
Что посоветуете -сначала удалить все связи, потом выполнить Alter и снова создать связи?

The object 'PK_mytable' is dependent on column 'id_field'.
Вообще то PK_mytable - это PrimaryKey
4 июн 12, 16:23    [12662842]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Горе шкодер)))
Guest
Glory
Вообще то PK_mytable - это PrimaryKey

Ну да, а это проблема?
Попробовал следующее:
1. Удалил первичный ключ:
IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[mytable]') AND name = N'PK_mytable')
ALTER TABLE [dbo].[mytable] DROP CONSTRAINT [PK_mytable]

Прошло успешно.
2. Выполнил запрос на увеличение размера поля успешно.
3. При попытке создать первичный ключ обломался:
ALTER TABLE [dbo].[mytable] ADD  CONSTRAINT [PK_mytable] PRIMARY KEY CLUSTERED 
(
	[id_field] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

Сообщение 8111, уровень 16, состояние 1, строка 3
Cannot define PRIMARY KEY constraint on nullable column in table 'mytable'.
4 июн 12, 16:47    [12663045]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Glory
Member

Откуда:
Сообщений: 104764
Горе шкодер)))
Ну да, а это проблема?

Проблема. Если вы собрались "сначала удалить все связи".
Потому что ПК к связям не имеет отношение.
4 июн 12, 16:52    [12663094]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
gang
Member

Откуда:
Сообщений: 1394
Горе шкодер)))
Сообщение 8111, уровень 16, состояние 1, строка 3
Cannot define PRIMARY KEY constraint on nullable column in table 'mytable'.

Ну и что вас смутило при переводе сообщения об ошибке?
4 июн 12, 16:53    [12663107]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Горе шкодер)))
Guest
Да, забыл в конец второго запроса "NOT NULL" дописать, не сразу моск включился на перевод ошибки. :)
Всем спасибо!!!
4 июн 12, 17:11    [12663279]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Горе шкодер)))
Guest
И еще вопрос - в качестве первичного ключа в этой таблице теперь будут строки разной длины. Чтобы в условиях отбора записей в запросах не дополнять это поле проблемами может стоит char(8) заменить на varchar(14)? Нет ли подводных камней в использовании полей varchar(n), где n <= 20, в качестве первичного ключа?
5 июн 12, 08:47    [12665434]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Горе шкодер)))
Guest
*Не проблемами, а пробелами справа))))))))))
5 июн 12, 08:48    [12665435]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Горе шкодер)))
Нет ли подводных камней в использовании полей varchar(n), где n <= 20, в качестве первичного ключа?


Не более подводных камней, чем при использовании любого не целочисленного типа для целей ПК. Т.е. в общем случае - никаких проблем. Ну при условии, если n - вменяемых значений, вот как у вас.
Но замечу, что поле фиксированного размера (char) может работать чуть быстрее для целей как раз поиска/джойнов по нему (но может и нет). Зависит от числа строк и конкретных значений в такой PK-колонке, а также тех конкретных альтернатив char(n)/varchar(n) межу которыми идет выбор.
5 июн 12, 12:05    [12666962]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Горе шкодер)))
Guest
SamMan
Зависит от числа строк и конкретных значений в такой PK-колонке

Вообще там хранятся 4 и 7 байтные числа в HEX (раньше были только 4 байтные), имеем соответственно 8 или 14 шестнадцатеричных цифр, подумываю сделать varchar с запасом на 10 байт (20 цифр).
5 июн 12, 12:32    [12667177]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Горе шкодер)))
Вообще там хранятся 4 и 7 байтные числа в HEX


Хмм... Заюзать для этой цели наш обычный, рабоче-крестьянский bigint в голову уже приходила?
5 июн 12, 13:35    [12667790]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11405
SamMan
Горе шкодер)))
Вообще там хранятся 4 и 7 байтные числа в HEX


Хмм... Заюзать для этой цели наш обычный, рабоче-крестьянский bigint в голову уже приходила?

Или такой вариант:
CREATE TABLE #t (a BINARY(8) CONSTRAINT PK PRIMARY KEY)

INSERT INTO #t
        (a)
SELECT a FROM 
(VALUES  (0x0102030405060708),(0x090A0B0C0D0E0F10)
         ) a(a)

SELECT * FROM #t
5 июн 12, 14:08    [12668148]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Горе шкодер)))
Guest
Как я уже писал, велосипед был придуман давно и не мной.
Да, если это числа до 8 байт, эти варианты катят.
Но есть несколько "но":
1. Сдается мне, что достаточно скоро придется хранить и 10-байтные числа (поэтому и хочу задать полю тип varchar(20)).
2. При смене формата поля ID с текстового на числовой придется перелопатить в поисках этого ID приличное число кода в хранимых процедурах и исходах отдельных утилит, а базе в текущем виде, надеюсь, осталось жить не так долго (мейби еще год-два).
Мне кажется, логичней решить текущие потребности малой кровью (лишь бы было не хуже чем сейчас).
5 июн 12, 14:32    [12668462]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
kDnZP
Или такой вариант


Верю, что BIGINT-колонка будет несколько быстрее в поиске чем BINARY(8)-колонка. Впрочем, это вопрос именно веры, т.к. разница в перфомансе хорошо если составит 1-2ms даже на очень приличной, по числу строк, таблице.
5 июн 12, 14:37    [12668507]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Горе шкодер)))
При смене формата поля ID с текстового на числовой придется перелопатить в поисках этого ID приличное число кода в хранимых процедурах


А не допускаете, что ЛЮБАЯ смена типа колонки может вести к такому же "лопаченью"? Ведь код может быть и "заточен" именно под существующие реалии...
5 июн 12, 14:39    [12668533]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11405
SamMan, две причины - для более чем 8 байт нужно еще одно поле и выигрыш становится сомнителен... Но и для одного BIGINT есть ограничение на то, что он SIGNED. Это создаст дополнительные трудности по конвертации.
DECLARE @a BIGINT
SET	@a=18446744073709551616
DECLARE @b BIGINT
SET	@b=9223372036854775807
5 июн 12, 14:42    [12668564]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11405
kDnZP, хотя не, вру... Сложностей с конвертацией особых нет.
DECLARE @c BIGINT
SET	@c=0xFFFFFFFFFFFFFFFF
SELECT @c
5 июн 12, 14:45    [12668595]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
kDnZP
Сложностей с конвертацией особых нет.

Я бы даже добавил "...и быть не может". Поскольку хранится все - в байтах, "уходит по проводам" клиенту - в байтах, а интерпретация этих байтов клиентом есть 100% прерогатива последнего, в кою сервер вмешаться не может. Даже если это ему взбредет в голову со страшного перепуга.

kDnZP
SamMan, две причины - для более чем 8 байт нужно еще одно поле

А вот это - несомненно, однако ТС обещал что "только 7"...
5 июн 12, 15:00    [12668731]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11405
+ OFFTOP
SamMan
Я бы даже добавил "...и быть не может". Поскольку хранится все - в байтах, "уходит по проводам" клиенту - в байтах, а интерпретация этих байтов клиентом есть 100% прерогатива последнего, в кою сервер вмешаться не может. Даже если это ему взбредет в голову со страшного перепуга.

Может в битах? Или электронах (а иногда даже в фотонах по оптоволокну)?
* Проблемы с конвертацией дат, чисел и чегоугодно еще возникают на форуме периодически.

Ну я же уже показал, что если попытаться записать число в десятичной системе, то сложности будут.
5 июн 12, 15:13    [12668848]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Горе шкодер)))
Guest
SamMan
А не допускаете, что ЛЮБАЯ смена типа колонки может вести к такому же "лопаченью"?

Сейчас ID строго по 4 байта. В условиях отбора используется строгое равенство типа:
select * from mytable where id_field='00000000'

Думаю, все изменения сведутся к изменению типа ID в параметрах хранимых процедур, а также в утилитах размеры полей в компонентах Ado. Сами запросы в хранимых процедурах и коде утилит искать и менять скорее всего не придется.
SamMan
ТС обещал что "только 7"

Сейчас просят ID по 4 и 7 байт, но добрые люди подсказали, что у таких предметов бывают и более длинные ID, посоветовали сразу сделать с запасом. Получается, можно с чистой совестью менять на varchar(20)?
В новой версии БД, разумеется, будет нормальный автоинкрементный ID и на него будут ссылаться другие таблицы, а ID предмета с длиной до 20 шестнадцатиричных цифр будет как обязательное неключевое поле.
5 июн 12, 15:36    [12669033]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Горе шкодер)))
Сами запросы в хранимых процедурах и коде утилит искать и менять скорее всего не придется.


Я бы был осторожнее - ВЫСОКА ВЕРОЯТНОСТЬ, что не придется. Где-то так...

Горе шкодер)))
Получается, можно с чистой совестью менять на varchar(20)?


Как уже отметил выше, просто в факте наличия PK типа varchar(20) нет совершенно никакого криминала. Все будет работать. Разумеется, при условии корректного T-SQL кода, как несложно догадаться...
5 июн 12, 15:44    [12669102]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Горе шкодер)))
Guest
Еще раз хочу всех поблагодарить за помощь!
5 июн 12, 16:03    [12669251]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Увеличить размер поля (строка)  [new]
I.CaR
Member [скрыт]

Откуда:
Сообщений: 58
Думаю правильнее будет использовать MODIFY:
перевод Google:
MODIFY
- Можно изменить определение столбца, но не его имя.
- Более удобно, чем CHANGE, изменить определение столбца без его переименования.
- С помощью FIRST или AFTER можно изменить порядок столбцов.

И сам делаю как-то так:
ALTER TABLE table_name MODIFY `column_name` VARCHAR([нужное_число]);
21 сен 17, 11:49    [20811636]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить