ADD в Oracle SQL — как добавлять столбцы, ограничения и элементы в таблицу

🟢 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 INDEX

22. Первичный ключ составной

ALTER TABLE order_items ADD CONSTRAINT pk_order_items PRIMARY KEY (order_id,item_id) USING INDEX

23. Уникальность кода

ALTER TABLE products ADD CONSTRAINT uq_products_code UNIQUE (code) USING INDEX

24. Проверка диапазона значений

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 CASCADE

28. Связь с очисткой значения

ALTER TABLE employees ADD CONSTRAINT fk_emp_mgr FOREIGN KEY (manager_id) REFERENCES employees(emp_id) ON DELETE SET NULL

29. Отложенная проверка

ALTER TABLE invoices ADD CONSTRAINT uq_invoice_no UNIQUE (invoice_no) DEFERRABLE INITIALLY DEFERRED

30. Включить без валидации

ALTER TABLE shipments ADD CONSTRAINT chk_weight CHECK (weight>0) ENABLE NOVALIDATE

31. Полагаться без проверки

ALTER TABLE facts ADD CONSTRAINT chk_positive CHECK (val>=0) RELY

32. Связь с индексом на 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_sales

42. Секция с максимальным значением

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_extra

46. Субсекция по стране в годовой секции

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 p2026

50. Глобальный партиционированный индекс — секция

ALTER INDEX ix_sales_global ADD PARTITION p2026

51. Секция индекса с таблиспейсом

ALTER INDEX ix_clients ADD PARTITION p_eu TABLESPACE ts_idx

52. Субсекция индекса по региону

ALTER INDEX ix_sales_comp MODIFY PARTITION p2025 ADD SUBPARTITION sp_us

53. Секция для архивного диапазона

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_more

57. Секция списка с таблиспейсом

ALTER TABLE region_lst ADD PARTITION p_apac VALUES ('JP','AU','IN') TABLESPACE ts_apac

58. Субсекция для 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 OFF

62. Redo‑лог новая группа

ALTER DATABASE ADD LOGFILE GROUP 4 '/u01/oradata/redo04a.log' SIZE 200M

63. Redo‑лог ещё один член группы

ALTER DATABASE ADD LOGFILE MEMBER '/u01/oradata/redo04b.log' TO GROUP 4

64. Standby‑журнал для Data Guard

ALTER DATABASE ADD STANDBY LOGFILE '/u01/oradata/standby01.log' SIZE 200M

65. Ещё standby‑журнал

ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 '/u01/oradata/standby10.log' SIZE 200M

66. Дополнительное журналирование БД

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA

67. Журналирование ключей таблицы

ALTER TABLE orders ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS

68. Журналирование всех столбцов

ALTER TABLE customers ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS

69. Материализованный журнал: новые поля

ALTER MATERIALIZED VIEW LOG ON orders ADD (amount,status)

70. Материализованный журнал: первичный ключ

ALTER MATERIALIZED VIEW LOG ON customers ADD PRIMARY KEY

71. Материализованный журнал: последовательность

ALTER MATERIALIZED VIEW LOG ON items ADD SEQUENCE

72. Материализованный журнал: фильтр DML

ALTER MATERIALIZED VIEW LOG ON sales ADD ROWID

73. Файл данных с компрессией таблиспейса

ALTER TABLESPACE ts_archive ADD DATAFILE '/u01/oradata/arch01.dbf' SIZE 500M

74. TEMPFILE для разгрузки сортировок

ALTER TABLESPACE temp ADD TEMPFILE '/u01/oradata/temp03.dbf' SIZE 2G

75. Ещё логфайл для пика нагрузки

ALTER DATABASE ADD LOGFILE '/u01/oradata/redo_extra.log' SIZE 300M

76. Запасной standby‑журнал

ALTER DATABASE ADD STANDBY LOGFILE '/u01/oradata/standby_res.log' SIZE 300M

77. Мат. журнал: включить старшую метку времени

ALTER MATERIALIZED VIEW LOG ON events ADD SYSTIMESTAMP

78. Мат. журнал: добавить выражение

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 CASCADE

90. Столбец для версионирования

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 NULL

95. Секция для архива

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 p2029

98. Субсекция индекса для США

ALTER INDEX ix_sales_comp MODIFY PARTITION p2026 ADD SUBPARTITION sp_us

Документация


🧩 Заключение

Ключевое слово ADD — важный инструмент для развития и изменения структуры базы данных. Оно позволяет добавлять не только столбцы, но и ограничения, а также партиции и другие элементы.

💡 Полезно помнить:

  • Используется только с ALTER

  • Может добавлять несколько элементов за раз

  • Требует прав на изменение схемы

  • Часто используется в миграциях, администрировании и DevOps


🔜 Следующая статья:

ACCESS в Oracle SQL — как использовать системную переменную доступа


 

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии