Як змінити тип поля, довжину поля або порядок полів

Як змінити тип поля, довжину поля або порядок полів

Починаючи з версії 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"