ADD в Oracle SQL. Введение
Когда нужно элегантно «прикрутить» новые столбцы, ограничения, секции или файлы — в ход идёт ключевое слово ADD. Я обожаю, как в Oracle можно развивать схему без простоев: расширять таблицы, укреплять целостность и масштабировать хранение — всё это в пару строк. Давай разберёмся по‑человечески: что, где и как именно добавлять безопасно и красиво.
Синтаксис ADD
-- Столбцы
ALTER TABLE t ADD (col_name datatype [DEFAULT expr] [NOT NULL]);
-- Ограничения
ALTER TABLE t ADD CONSTRAINT c_name PRIMARY KEY (col1,col2) USING INDEX;
ALTER TABLE t ADD CONSTRAINT c_name UNIQUE (col);
ALTER TABLE t ADD CONSTRAINT c_name CHECK (expr);
ALTER TABLE t ADD CONSTRAINT c_fk FOREIGN KEY (col) REFERENCES parent(pk) ON DELETE CASCADE;
-- Партиции/субпартиции
ALTER TABLE t ADD PARTITION p2026 VALUES LESS THAN (DATE '2026-01-01');
ALTER TABLE t MODIFY PARTITION p2025 ADD SUBPARTITION sp_us VALUES ('US');
-- Индексы (партиции)
ALTER INDEX ix_t ADD PARTITION p2026;
-- Табличные пространства и БД
ALTER TABLESPACE ts_data ADD DATAFILE '/u01/oradata/ts_data01.dbf' SIZE 100M AUTOEXTEND ON;
ALTER DATABASE ADD LOGFILE GROUP 4 '/u01/oradata/redo04.log' SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE SIZE 200M;
-- Мат. журналы
ALTER MATERIALIZED VIEW LOG ON t ADD (col1,col2);
-- Журналирование изменений
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER TABLE t ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;Где используют ADD
- Эволюция схемы: расширяешь модель без простоя — новые столбцы и ограничения через ALTER TABLE.
- Производительность: партиции и субпартиции — гибкое масштабирование больших таблиц и индексов через PARTITION.
- Хранилище: расширяешь дисковое пространство с ALTER TABLESPACE и ALTER DATABASE.
- Репликация и логи: настраиваешь дополнительные журналы через SUPPLEMENTAL LOG DATA и мат. журналы.
100 примеров
1. Новый числовой столбец с умолчанием
ALTER TABLE orders ADD (discount NUMBER DEFAULT 0)2. Текстовый столбец фиксированной длины
ALTER TABLE customers ADD (region CHAR(2))3. Дата с обязательным значением
ALTER TABLE shipments ADD (ship_date DATE DEFAULT SYSDATE NOT NULL)4. Временная метка с часовым поясом
ALTER TABLE events ADD (created_at TIMESTAMP WITH TIME ZONE DEFAULT SYSTIMESTAMP)5. Виртуальное поле из выражения
ALTER TABLE items ADD (price_with_tax GENERATED ALWAYS AS (price*1.2) VIRTUAL)6. Скрытый столбец для служебных нужд
ALTER TABLE audit_log ADD (trace_id VARCHAR2(36) INVISIBLE)7. Число с ограничением места
ALTER TABLE metrics ADD (ratio NUMBER(5,2))8. Строка переменной длины
ALTER TABLE vendors ADD (contact_email VARCHAR2(255))9. Булев эквивалент через CHECK
ALTER TABLE flags ADD (is_active NUMBER(1) DEFAULT 0)10. LOB для больших заметок
ALTER TABLE issues ADD (note CLOB)11. BLOB для файлов
ALTER TABLE attachments ADD (bin BLOB)12. Список через перечисление значений
ALTER TABLE orders ADD (status VARCHAR2(10) DEFAULT 'NEW')13. Значение по умолчанию на NULL
ALTER TABLE tickets ADD (priority NUMBER DEFAULT ON NULL 3)14. Ссылочный идентификатор
ALTER TABLE posts ADD (category_id NUMBER)15. Числовой ключ с авто‑значениями (по месту)
ALTER TABLE seq_demo ADD (id NUMBER DEFAULT sequence_id.NEXTVAL)16. Индексируемое вычисляемое поле
ALTER TABLE sales ADD (ym GENERATED ALWAYS AS (TO_CHAR(sale_date,'YYYYMM')) VIRTUAL)17. Тонкая настройка длины текста
ALTER TABLE profiles ADD (bio VARCHAR2(500))18. Короткий код страны
ALTER TABLE addresses ADD (country_code CHAR(2))19. Отметка изменения строки
ALTER TABLE products ADD (updated_at TIMESTAMP DEFAULT SYSTIMESTAMP)20. Колонка для мягкого удаления
ALTER TABLE users ADD (deleted_at TIMESTAMP)Еще 20 примеров
21. Первичный ключ на одном столбце
ALTER TABLE customers ADD CONSTRAINT pk_customers PRIMARY KEY (customer_id) USING INDEX22. Первичный ключ составной
ALTER TABLE order_items ADD CONSTRAINT pk_order_items PRIMARY KEY (order_id,item_id) USING INDEX23. Уникальность кода
ALTER TABLE products ADD CONSTRAINT uq_products_code UNIQUE (code) USING INDEX24. Проверка диапазона значений
ALTER TABLE employees ADD CONSTRAINT chk_salary CHECK (salary BETWEEN 0 AND 1000000)25. Запрет пустой строки
ALTER TABLE tags ADD CONSTRAINT chk_tag_not_blank CHECK (TRIM(name)<>'' )26. Внешний ключ на справочник
ALTER TABLE posts ADD CONSTRAINT fk_posts_category FOREIGN KEY (category_id) REFERENCES categories(category_id)27. Связь с каскадным удалением
ALTER TABLE comments ADD CONSTRAINT fk_comments_post FOREIGN KEY (post_id) REFERENCES posts(post_id) ON DELETE CASCADE28. Связь с очисткой значения
ALTER TABLE employees ADD CONSTRAINT fk_emp_mgr FOREIGN KEY (manager_id) REFERENCES employees(emp_id) ON DELETE SET NULL29. Отложенная проверка
ALTER TABLE invoices ADD CONSTRAINT uq_invoice_no UNIQUE (invoice_no) DEFERRABLE INITIALLY DEFERRED30. Включить без валидации
ALTER TABLE shipments ADD CONSTRAINT chk_weight CHECK (weight>0) ENABLE NOVALIDATE31. Полагаться без проверки
ALTER TABLE facts ADD CONSTRAINT chk_positive CHECK (val>=0) RELY32. Связь с индексом на FK
ALTER TABLE orders ADD CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id)33. Проверка по шаблону
ALTER TABLE users ADD CONSTRAINT chk_email CHECK (REGEXP_LIKE(email,'^[^@]+@[^@]+\.[^@]+$'))34. Запрет будущих дат
ALTER TABLE tasks ADD CONSTRAINT chk_due CHECK (due_date<=SYSDATE)35. Единственный активный флаг
ALTER TABLE feature_flags ADD CONSTRAINT chk_flag CHECK (flag IN(0,1))36. Целостность по типу операции
ALTER TABLE operations ADD CONSTRAINT chk_op CHECK (op_type IN('C','U','D'))37. Исключить пересечение интервалов
ALTER TABLE booking ADD CONSTRAINT chk_range CHECK (start_time<end_time)38. Ненулевой остаток
ALTER TABLE stock ADD CONSTRAINT chk_qty CHECK (qty>=0)39. Уникальность среди активных
ALTER TABLE usernames ADD CONSTRAINT uq_active UNIQUE (login)40. Диапазонная секция нового года
ALTER TABLE sales_rng ADD PARTITION p2026 VALUES LESS THAN (DATE '2026-01-01')Еще 20 примеров
41. Диапазонная секция с таблиспейсом
ALTER TABLE sales_rng ADD PARTITION p2027 VALUES LESS THAN (DATE '2027-01-01') TABLESPACE ts_sales42. Секция с максимальным значением
ALTER TABLE sales_rng ADD PARTITION pmax VALUES LESS THAN (MAXVALUE)43. Список значений для региона
ALTER TABLE clients_lst ADD PARTITION p_us VALUES ('US','CA')44. Список для Европы
ALTER TABLE clients_lst ADD PARTITION p_eu VALUES ('DE','FR','ES','IT')45. Хеш‑секция дополнительная
ALTER TABLE clicks_hash ADD PARTITION p_extra46. Субсекция по стране в годовой секции
ALTER TABLE sales_comp MODIFY PARTITION p2025 ADD SUBPARTITION sp_us VALUES ('US')47. Субсекция для Канады
ALTER TABLE sales_comp MODIFY PARTITION p2025 ADD SUBPARTITION sp_ca VALUES ('CA')48. Шаблон субсекций — одна вручную
ALTER TABLE sales_comp MODIFY PARTITION p2026 ADD SUBPARTITION sp_uk VALUES ('UK')49. Локальный индекс — новая секция
ALTER INDEX ix_sales_local ADD PARTITION p202650. Глобальный партиционированный индекс — секция
ALTER INDEX ix_sales_global ADD PARTITION p202651. Секция индекса с таблиспейсом
ALTER INDEX ix_clients ADD PARTITION p_eu TABLESPACE ts_idx52. Субсекция индекса по региону
ALTER INDEX ix_sales_comp MODIFY PARTITION p2025 ADD SUBPARTITION sp_us53. Секция для архивного диапазона
ALTER TABLE audit_rng ADD PARTITION p_old VALUES LESS THAN (DATE '2010-01-01')54. Список новых категорий
ALTER TABLE products_lst ADD PARTITION p_new VALUES ('NEW','HOT')55. Секция MAXVALUE для страховки
ALTER TABLE prices_rng ADD PARTITION p_end VALUES LESS THAN (MAXVALUE)56. Дополнительная хеш‑секция индекса
ALTER INDEX ix_clicks_hash ADD PARTITION p_more57. Секция списка с таблиспейсом
ALTER TABLE region_lst ADD PARTITION p_apac VALUES ('JP','AU','IN') TABLESPACE ts_apac58. Субсекция для LATAM
ALTER TABLE sales_comp MODIFY PARTITION p2026 ADD SUBPARTITION sp_latam VALUES ('BR','AR','MX')59. Секция для следующего года
ALTER TABLE sales_rng ADD PARTITION p2028 VALUES LESS THAN (DATE '2028-01-01')60. Новый файл данных в табличное пространство
ALTER TABLESPACE ts_data ADD DATAFILE '/u01/oradata/ts_data02.dbf' SIZE 200M AUTOEXTEND ON NEXT 20M MAXSIZE 4GЕще 20 примеров
61. Дополнительный tempfile в TEMP
ALTER TABLESPACE temp ADD TEMPFILE '/u01/oradata/temp02.dbf' SIZE 1G AUTOEXTEND OFF62. Redo‑лог новая группа
ALTER DATABASE ADD LOGFILE GROUP 4 '/u01/oradata/redo04a.log' SIZE 200M63. Redo‑лог ещё один член группы
ALTER DATABASE ADD LOGFILE MEMBER '/u01/oradata/redo04b.log' TO GROUP 464. Standby‑журнал для Data Guard
ALTER DATABASE ADD STANDBY LOGFILE '/u01/oradata/standby01.log' SIZE 200M65. Ещё standby‑журнал
ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 '/u01/oradata/standby10.log' SIZE 200M66. Дополнительное журналирование БД
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA67. Журналирование ключей таблицы
ALTER TABLE orders ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS68. Журналирование всех столбцов
ALTER TABLE customers ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS69. Материализованный журнал: новые поля
ALTER MATERIALIZED VIEW LOG ON orders ADD (amount,status)70. Материализованный журнал: первичный ключ
ALTER MATERIALIZED VIEW LOG ON customers ADD PRIMARY KEY71. Материализованный журнал: последовательность
ALTER MATERIALIZED VIEW LOG ON items ADD SEQUENCE72. Материализованный журнал: фильтр DML
ALTER MATERIALIZED VIEW LOG ON sales ADD ROWID73. Файл данных с компрессией таблиспейса
ALTER TABLESPACE ts_archive ADD DATAFILE '/u01/oradata/arch01.dbf' SIZE 500M74. TEMPFILE для разгрузки сортировок
ALTER TABLESPACE temp ADD TEMPFILE '/u01/oradata/temp03.dbf' SIZE 2G75. Ещё логфайл для пика нагрузки
ALTER DATABASE ADD LOGFILE '/u01/oradata/redo_extra.log' SIZE 300M76. Запасной standby‑журнал
ALTER DATABASE ADD STANDBY LOGFILE '/u01/oradata/standby_res.log' SIZE 300M77. Мат. журнал: включить старшую метку времени
ALTER MATERIALIZED VIEW LOG ON events ADD SYSTIMESTAMP78. Мат. журнал: добавить выражение
ALTER MATERIALIZED VIEW LOG ON sales ADD (TRUNC(sale_date))79. Несколько столбцов за один заход
ALTER TABLE profile ADD (avatar_url VARCHAR2(400),timezone VARCHAR2(64))80. Колонка с пустым BLOB по умолчанию
ALTER TABLE media ADD (blob_data BLOB DEFAULT EMPTY_BLOB())Еще 20 примеров
81. Число с ограничением и CHECK
ALTER TABLE ratings ADD (stars NUMBER(1))82. Уникальность пары значений
ALTER TABLE pairs ADD CONSTRAINT uq_pairs UNIQUE (a,b)83. FK с именованным индексом на PK
ALTER TABLE child ADD CONSTRAINT fk_child_parent FOREIGN KEY (parent_id) REFERENCES parent(id)84. CHECK со сложным выражением
ALTER TABLE payments ADD CONSTRAINT chk_amt CHECK (amount>=0 AND currency IN('USD','EUR'))85. Столбец видимый позже
ALTER TABLE audit ADD (debug_flag NUMBER(1) DEFAULT 0 INVISIBLE)86. Виртуальное поле‑метка года
ALTER TABLE calendar ADD (yyyy GENERATED ALWAYS AS (TO_CHAR(dt,'YYYY')) VIRTUAL)87. Метка пользователя создателя
ALTER TABLE docs ADD (created_by NUMBER)88. Ограничение на формат телефона
ALTER TABLE contacts ADD CONSTRAINT chk_phone CHECK (REGEXP_LIKE(phone,'^\+?[0-9]{10,15}$'))89. Обязательный внешний ключ с каскадом
ALTER TABLE invoice_items ADD CONSTRAINT fk_inv_items FOREIGN KEY (invoice_id) REFERENCES invoices(id) ON DELETE CASCADE90. Столбец для версионирования
ALTER TABLE rows ADD (ver NUMBER DEFAULT 0 NOT NULL)91. Метка времени изменений
ALTER TABLE rows ADD (changed_at TIMESTAMP DEFAULT SYSTIMESTAMP)92. Статус со списком допустимых
ALTER TABLE orders ADD CONSTRAINT chk_status CHECK (status IN('NEW','PAID','CANCELLED'))93. Колонка JSON для гибких атрибутов
ALTER TABLE products ADD (attrs CLOB)94. FK со стратегией SET NULL
ALTER TABLE orders ADD CONSTRAINT fk_orders_agent FOREIGN KEY (agent_id) REFERENCES agents(id) ON DELETE SET NULL95. Секция для архива
ALTER TABLE audit_rng ADD PARTITION p_arc VALUES LESS THAN (DATE '2000-01-01')96. Секция списка для маркетинга
ALTER TABLE segments_lst ADD PARTITION p_promo VALUES ('PROMO')97. Новая секция индекса по году
ALTER INDEX ix_sales_y ADD PARTITION p202998. Субсекция индекса для США
ALTER INDEX ix_sales_comp MODIFY PARTITION p2026 ADD SUBPARTITION sp_usДокументация
- ALTER TABLE (добавление столбцов и ограничений)
- ALTER TABLESPACE (ADD DATAFILE/TEMPFILE)
- ALTER DATABASE (ADD LOGFILE/STANDBY LOGFILE)
- ALTER/CREATE MATERIALIZED VIEW LOG
🧩 Заключение
Ключевое слово ADD — важный инструмент для развития и изменения структуры базы данных. Оно позволяет добавлять не только столбцы, но и ограничения, а также партиции и другие элементы.
💡 Полезно помнить:
Используется только с
ALTERМожет добавлять несколько элементов за раз
Требует прав на изменение схемы
Часто используется в миграциях, администрировании и DevOps
🔜 Следующая статья:
ACCESS в Oracle SQL — как использовать системную переменную доступа