Як змінити тип поля, довжину поля або порядок полів
Як змінити тип поля, довжину поля або порядок полів
Починаючи з версії InterBase 6.0 все нижчевикладене є хаком, тому що в InterBase 6 і всіх версіях вище (InterBase, Firebird, Yaffil) підтримується оператор table column. Див. Документацію.
Почнемо з того, що в стандарті (ANSI SQL 92 entry level) немає визначення вартості мовних конструкцій для модифікації типу поля. Однак ядро IB цілком може виконувати такі дії завдяки спеціальному механізму відстеження відповідності фізичних даних, і інформації про їх типах в системних таблицях.
Робиться це так (найкраще запустити Database Explorer з увімкненим пунктом View / System Data):
1. знайдіть ваше поле в таблиці RDB $ RELATION_FIELDS за назвою підлогу (RBD $ .FIELD_NAME) і імені таблиці (RDB $ RELATION_NAME). Запам'ятайте вміст поля RDB $ FIELD_SOURCE - там має бути щось на зразок RDB $ nnn.
2. Знайдене RDB $ nnn тепер знайдіть в таблиці RDB $ FIELDS
3. Поміняйте на виставлені довжину поля (RDB $ FIELD_LENGTH) або тип поля (RDB $ FIELD_TYPE). Порядок полів змінюється в поле RDB $ FIELD_POSITION
Примітка: в Database Explorer можна прискорити виконання пункту 1 - відкрийте вашу БД, виберіть Tables, потрібну таблицю, Columns, і потрібне поле. в Field Definition значенням поля Domain і відповідає те, що ви шукаєте (RDB $ nnn). Далі виконуйте пункти 2 і 3.
При цьому ви все ще будете продовжувати бачити стару інформацію про полях таблиці. Нову структуру ви побачите після перез'єднання до БД. При цьому в БД буде відбуватися наступне:
Особливо корисно таке властивість IB, коли вам потрібно змінити довжину строкового поля, яку ви може-бути необачно визначили замалою. Наприклад CHAR (20) на CHAR (50), і т.д.
Ann Harrison запропонувала готові запити для зміни довжини строкових (CHAR і VARCHAR) типів у таблиць:
Зміна типу BLOB:
(В даному прикладі з будь-якого підтипу на підтип 0)
rdb $ fields f set f.rdb $ field_sub_type = 0
where f.rdb $ field_name =
(Select rfr.rdb $ field_source
from rdb $ relation_fields rfr
where rfr.rdb $ field_name = "COLUMN_NAME" and rfr.rdb $ relation_name = "TABLE_NAME"