Предложение USING
Предложение USING
позволяет задать определённое пользователем имя автоматически создаваемого индекса для ограничения, и опционально определить, какой это будет индекс — по возрастанию (по умолчанию) или по убыванию.
Предложение USING
позволяет задать определённое пользователем имя автоматически создаваемого индекса для ограничения, и опционально определить, какой это будет индекс — по возрастанию (по умолчанию) или по убыванию.
Ограничение первичного ключа PRIMARY KEY
строится на поле с заданным ограничением NOT NULL
и требует уникальности значений столбца.Таблица может иметь только один первичный ключ.
Первичный ключ по единственному столбцу может быть определён как на уровне столбца, так и на уровне таблицы.
Первичный ключ по нескольким столбцам может быть определён только на уровне таблицы.
Ограничение уникального ключа UNIQUE
задаёт для значений столбца требование уникальности содержимого.Таблица может содержать любое количество уникальных ключей.
Как и первичный ключ, ограничение уникальности может быть определено на нескольких столбцах.В этом случае вы должны определять его как ограничение уровня таблицы.
Согласно стандарту SQL-99 Firebird допускает одно или более значений NULL
в столбце на который наложено ограничение UNIQUE
.Это позволяет определить ограничение UNIQUE
на столбцах, которые не имеют ограничения NOT NULL
.
Для уникальных ключей, содержащих несколько столбцов, логика немного сложнее:
Разрешено множество записей со значением NULL во всех столбцах ключа;
Разрешено множество записей с различными комбинациями null и not-null значений в ключах;
Разрешено множество записей, в которых в одном из столбцов уникального ключа содержится значение NULL, а остальные столбцы заполнены значениями и эти значения различны хотя бы в одном из них;
Разрешено множество записей, в которых в одном из столбцов уникального ключа содержится значение NULL, а остальные столбцы заполнены значениями, и эти значения имеют совпадения хотя бы в одном из них.
Это можно резюмировать следующим примером:
RECREATE TABLE t( x int, y int, z int, unique(x,y,z));
INSERT INTO t values( NULL, 1, 1 );
INSERT INTO t values( NULL, NULL, 1 );
INSERT INTO t values( NULL, NULL, NULL );
INSERT INTO t values( NULL, NULL, NULL ); -- Разрешено
INSERT INTO t values( NULL, NULL, 1 ); -- Запрещено
Ограничение внешнего ключа гарантирует, что столбец (столбцы) участник может содержать только те значения, которые существуют в указанном столбце (столбцах) главной таблицы.Эти ссылочные столбцы часто называют столбцами назначения.Они должны быть первичным ключом или уникальным ключом в целевой таблице.Они могут не иметь ограничения NOT NULL
, если они входят в ограничение уникального ключа.
Столбцы внешнего ключа не требуют ограничения NOT NULL
.
На уровне столбца ограничение внешнего ключа определяется с использованием ключевого слова REFERENCES
.
... ,
ARTIFACT_ID INTEGER REFERENCES COLLECTION (ARTIFACT_ID),
В этом примере столбец ARTIFACT_ID ссылается на столбец с тем же именем в таблице COLLECTION.
На уровне таблицы могут быть определены внешний ключ над одним или несколькими столбцами.Внешние ключи над несколькими столбцами можно определить только на уровне таблицы.
Синтаксис определения внешнего ключа на уровне таблицы несколько отличается.После определения всех столбцов, с их ограничения уровня столбца, вы можете определить именованное ограничение внешнего ключа уровня таблицы, используя ключевые слова FOREIGN KEY
и имён столбцов для которых оно применяется:
... ,
CONSTRAINT FK_ARTSOURCE FOREIGN KEY(DEALER_ID, COUNTRY)
REFERENCES DEALER (DEALER_ID, COUNTRY),
Обратите внимание на то, что имена столбцов в целевой (master) таблице могут отличаться от тех что указаны во внешнем ключе.
Note
|
Если целевые столбцы не указаны, то внешний ключ автоматически ссылается на столбцы первичного ключа целевой таблицы. |
Для обеспечения дополнительной целостности данных можно указать необязательные опции, которые обеспечат согласованность данных между родительскими и дочерними таблицами по заданным правилам:
Предложение ON UPDATE
определяет, что произойдёт с записями подчинённой таблицы при изменении значения первичного/уникального ключа в строке главной таблицы.
Предложение ON DELETE
определяет, что произойдёт с записями подчинённой таблицы при удалении соответствующей строки главной таблицы.
Для обеспечения ссылочной целостности внешнего ключа, когда изменяется или удаляется значение связанного первичного или уникального ключа, могут быть выполнены следующие действия:
NO ACTION
(по умолчанию) — не будет выполнено никаких действий;
CASCADE
— при изменении или удалении значения первичного ключа над значением внешнего ключа будут произведены те же действия. При выполнении удаления строки в главной таблице в подчинённой таблице должны быть удалены все записи, имеющие те же значения внешнего ключа, что и значение первичного (уникального) ключа удалённой строки главной таблицы. При выполнении обновления записи главной таблицы в подчинённой таблице должны быть изменены все значения внешнего ключа, имеющие те же значения, что и значение первичного (уникального) ключа изменяемой строки главной таблицы;
SET DEFAULT
— значения внешнего ключа всех соответствующих строк в подчинённой таблице устанавливаются в значение по умолчанию, заданное в предложении DEFAULT для этого столбца;
SET NULL
— значения внешнего ключа всех соответствующих строк в подчинённой таблице устанавливаются в пустое значение NULL.
CONSTRAINT FK_ORDERS_CUST
FOREIGN KEY (CUSTOMER) REFERENCES CUSTOMERS (ID)
ON UPDATE CASCADE ON DELETE SET NULL
Ограничение CHECK
задаёт условие, которому должны удовлетворять значения, помещаемые в данный столбец.Условие — это логическое выражение, называемое также предикат, которое может возвращать значения TRUE
(истина), FALSE
(ложь) и UNKNOWN
(неизвестно). Условие считается выполненным, если предикат возвращает значение TRUE
или UNKNOWN
(эквивалент NULL
). Если предикат возвращает FALSE
, то значение не будет принято.Это условие используется при добавлении в таблицу новой строки (оператор INSERT
) и при изменении существующего значения столбца таблицы (оператор UPDATE
), а также операторов, в которых может произойти одно из этих действий (UPDATE OR INSERT
, MERGE
).
Important
|
При использовании предложения |
На уровне столбца или таблицы выражение в предложении CHECK
ссылается на входящее значения с помощью с помощью идентификаторов столбцов, в отличие от доменов, где в ограничении CHECK
для этих целей используется ключевое слово VALUE
.
CREATE TABLE PLACES (
...
LAT DECIMAL(9, 6) CHECK (ABS(LAT) <= 90),
LON DECIMAL(9, 6) CHECK (ABS(LON) <= 180),
...
CONSTRAINT CHK_POLES CHECK (ABS(LAT) < 90 OR LON = 0)
);
Необязательное предложение SQL SECURITY
в спецификации таблицы позволяет задать с какими привилегиями вычисляются вычисляемые столбцы.Если выбрана опция INVOKER
, то вычисляемые столбцы вычисляются с привилегиями вызывающего пользователя.Если выбрана опция DEFINER
, то вычисляемые столбцы вычисляются с привилегиями определяющего пользователя (владельца). По умолчанию вычисляемые столбцы вычисляются с привилегиями вызывающего пользователя.Кроме триггеры наследуют привилегии выполнения таблицы, если они не переопределены у самих триггеров.
Tip
|
Привилегии выполнения по умолчанию для вновь создаваемых объектов метаданных можно изменить с помощью оператора ALTER DATABASE SET DEFAULT SQL SECURITY {DEFINER | INVOKER} |
ALTER TABLE
Изменение структуры таблицы.
DSQL, ESQL.
ALTER TABLE tablename <operation> [, <operation>]; <operation> ::= ADD <col_def> | ADD <tconstraint> | DROP colname | DROP CONSTRAINT constr_name | DROP SQL SECURITY | ALTER [COLUMN] colname <col_mod> | ALTER SQL SECURITY {DEFINER | INVOKER} | {ENABLE | DISABLE} PUBLICATION <col_def> ::= <regular_col_def> | <computed_col_def> | <identity_col_def> <regular_col_def> ::= colname { <datatype> | domainname } [DEFAULT {literal | NULL | <context_var>}] [NOT NULL] [<col_constraint>] [COLLATE collation_name] <computed_col_def> ::= colname [<datatype>] {COMPUTED [BY] | GENERATED ALWAYS AS} (<expression>) <identity_col_def> ::= colname [<datatype>] {ALWAYS | GENERATED BY} DEFAULT AS IDENTITY [(START WITH startvalue)] [<col_constraint>] <col_mod> ::= TO newname | POSITION newpos | <regular_col_mod> | <computed_col_mod> | <identity_col_mod> <regular_col_mod> ::= | TYPE { <datatype> | domain_name } | SET DEFAULT {literal | NULL | <context_var>} | DROP DEFAULT | SET NOT NULL | DROP NOT NULL <computed_col_mod> ::= [TYPE <datatype>] {GENERATED ALWAYS AS | COMPUTED [BY]} (<expression>) <identity_col_mod> ::= <alter identity column option> ... | SET GENERATED { ALWAYS | BY DEFAULT } [<alter identity column option> ...] | DROP INDENITY <alter identity column option> ::= RESTART [ WITH startvalue ] | SET INCREMENT [BY] incrementvalue <datatype> ::= <scalar_datatype> | <blob_datatype> | <array_datatype> <scalar_datatype> ::= См. Синтаксис скалярных типов данных <blob_datatype> ::= См. Синтаксис типа данных BLOB <array_datatype> ::= См. Синтаксис массивов <col_constraint> ::= [CONSTRAINT constr_name] { UNIQUE [<using_index>] | PRIMARY KEY [<using_index>] | REFERENCES other_table [(other_col)] [ON DELETE { NO ACTION | CASCADE | SET DEFAULT | SET NULL}] [ON UPDATE { NO ACTION | CASCADE | SET DEFAULT | SET NULL}] [<using_index>] | CHECK (<check_condition>) } <tconstraint> ::= [CONSTRAINT constr_name] { UNIQUE (<col_list>) [<using_index>] | PRIMARY KEY (<col_list>) [<using_index>] | FOREIGN KEY (<col_list>) REFERENCES other_table [(<col_list>)] [ON DELETE { NO ACTION | CASCADE | SET DEFAULT | SET NULL}] [ON UPDATE { NO ACTION | CASCADE | SET DEFAULT | SET NULL}] [<using_index>] | CHECK (<check_condition>) } <col_list> ::= colname [, colname ...] <using_index> ::= USING [ASC[ENDING] | DESC[ENDING]] INDEX indexname <check_condition> ::= <val> <operator> <val> | <val> [NOT] BETWEEN <val> AND <val> | <val> [NOT] IN (<val> [, <val> ...] | <select_list>) | <val> IS [NOT] NULL | <val> IS [NOT] DISTINCT <val> | <val> IS [NOT] {TRUE | FALSE | UNKNOWN} | <val> [NOT] CONTAINING <val> | <val> [NOT] STARTING [WITH] <val> | <val> [NOT] LIKE <val> [ESCAPE <val>] | <val> [NOT] SIMILAR TO <val> [ESCAPE <val>] | <val> <operator> {ALL | SOME | ANY} (<select_list>) | [NOT] EXISTS (<select_expr>) | [NOT] SINGULAR (<select_expr>) | (<check_condition>) | NOT <check_condition> | <check_condition> OR <check_condition> | <check_condition> AND <check_condition> <operator> ::= <> | != | ^= | ~= | = | < | > | <= | >= | !< | ^< | ~< | !> | ^> | ~> <val> ::= colname [[<array_idx> [, <array_idx> ...]]] | literal | <context_var> | <expression> | NULL | NEXT VALUE FOR genname | GEN_ID(genname, <val>) | CAST(<val> AS <datatype>) | (<select_one>) | func(<val> [, <val> ...]) <cast_type> ::= <datatype> | [TYPE OF] domain_name | TYPE OF COLUMN rel.colname
Параметр | Описание |
---|---|
tablename |
Имя таблицы. |
operation |
Одна из допустимых операций по изменению структуры таблицы. |
colname |
Имя столбца таблицы, может содержать до 63 символов.Должно быть уникальным внутри таблицы. |
newname |
Новое имя столбца таблицы, может содержать до 63 символов.Должно быть уникальным внутри таблицы. |
gencolname |
Имя вычисляемого столбца таблицы. |
idencolname |
Имя столбца идентификации. |
newpos |
Новая позиция столбца в таблице.Целое число в диапазоне от 1 до количества столбцов таблицы. |
datatype |
Тип данных SQL. |
domain_name |
Имя домена. |
startvalue |
Начальное значение столбца идентификации. |
incrementvalue |
Значение приращения для столбца идентификации.Должно быть отлично от 0. |
col_constraint |
Ограничение столбца. |
tconstraint |
Ограничение таблицы. |
constr_name |
Имя ограничения, может содержать до 63 символов. |
other_table |
Имя таблицы, на которую ссылается внешний ключ. |
other_col |
Столбец таблицы, на которую ссылается внешний ключ. |
using_index |
Позволяет задать имя автоматически создаваемого индекса для ограничения, и опционально определить, какой это будет индекс — по возрастанию (по умолчанию) или по убыванию. |
literal |
Литерал. |
context_var |
Любая контекстная переменная, тип которой совместим с типом данных столбца. |
check_condition |
Условие проверки ограничения.Выполняется, если оценивается как |
collation_name |
Имя порядка сортировки.Необходимо указывать если вы хотите чтобы порядок сортировки для столбца отличался от порядка сортировки для набора символов по умолчанию этого столбца. |
select_one |
Оператор |
select_list |
Оператор |
select_expr |
Оператор |
experssion |
Выражение. |
genname |
Имя последовательности (генератора). |
func |
Скалярная функция. |
Оператор ALTER TABLE
изменяет структуру существующей таблицы.Одиночный оператор ALTER TABLE
позволяет производить множество операций добавления/удаления столбцов и ограничений, а также модификаций столбцов.Список операций выполняемых при модификации таблицы разделяется запятой.
Некоторые изменения структуры таблицы увеличивают счётчик форматов, закреплённый за каждой таблицей.Количество форматов для каждой таблицы ограничено значением 255.После того как счётчик форматов достигнет этого значения, вы не сможете больше менять структуру таблицы.
gbak
).
ADD
Предложение ADD
позволяет добавить новый столбец или новое ограничение таблицы.Синтаксис определения столбца и синтаксис описания ограничения таблицы полностью совпадают с синтаксисом, описанным в операторе CREATE TABLE.
При каждом добавлении нового столбца номер формата увеличивается на единицу.
Добавление нового ограничения таблицы не влечёт за собой увеличение номера формата.
ALTER TABLE COUNTRY
ADD CAPITAL VARCHAR(25);
NOT NULL
ALTER TABLE OBJECTS
ADD QUANTITY INT DEFAULT 1 NOT NULL;
Important
|
Обратите внимание на предложение |
ALTER TABLE COUNTRY
ADD CAPITAL VARCHAR(25) UNIQUE,
DROP CURRENCY;
Для добавления ограничений уровня таблицы необходимо использовать предложение ADD [CONSTRAINT]
.
ALTER TABLE JOB
ADD CONSTRAINT CHK_SALARY CHECK (MIN_SALARY < MAX_SALARY),
ADD FOREIGN KEY (JOB_COUNTRY)
REFERENCES COUNTRY (COUNTRY);
Warning
|
Будьте осторожны, при добавлении нового ограничения |
DROP
Предложение DROP
удаляет указанный столбец таблицы.Столбец таблицы не может быть удалён, если от него существуют зависимости.Другими словами для успешного удаления столбца на него должны отсутствовать ссылки.Ссылки на столбец могут содержаться:
в ограничениях столбцов или таблицы;
в индексах;
в хранимых процедурах и триггерах;
в представлениях.
При каждом удалении столбца номер формата увеличивается на единицу.
DROP CONSTRAINT
Предложение DROP CONSTRAINT
удаляет указанное ограничение столбца или таблицы.Ограничение первичного ключа или уникального ключа не могут быть удалены, если они используются в ограничении внешнего ключа другой таблицы.В этом случае необходимо удалить ограничение FOREIGN KEY
до удаления PRIMARY KEY
или UNIQUE
ключа, на которые оно ссылается.
Удаление ограничения столбца или ограничения таблицы не влечёт за собой увеличение номера формата.
DROP SQL SECURITY
Предложение DROP SQL SECURITY
удаляет привилегии выполнения для таблицы.После удаления привилегий выполнения вычисляемые столбцы таблицы будут вычисляться с привилегиями вызывающего пользователя.Триггеры также будут выполняться с привилегиями вызывающего пользователя, если их привилегии выполнения не переопределены в триггере явно.
ALTER [COLUMN]
Предложение ALTER [COLUMN]
позволяет изменить следующие характеристики существующих столбцов:
изменение имени (не изменяет номер формата);
изменение типа данных (увеличивает номер формата на единицу);
изменение позиции столбца в списке столбцов таблицы (не изменяет номер формата);
удаление значения по умолчанию столбца (не изменяет номер формата);
добавление значения по умолчанию столбца (не изменяет номер формата);
изменение типа и выражения для вычисляемого столбца (не изменяет номер формата);
добавление ограничения NOT NULL
(не изменяет номера формата);
удаление ограничения NOT NULL
(не изменяет номера формата).
Ключевое слово TO
переименовывает существующий столбец.Новое имя столбца не должно присутствовать в таблице.
Невозможно изменение имени столбца, если этот столбец включён в какое-либо ограничение — первичный или уникальный ключ, внешний ключ, ограничение столбца или проверочное ограничение таблицы CHECK
.Имя столбца также нельзя изменить, если этот столбец таблицы используется в каком-либо триггере, в хранимой процедуре или представлении.
ALTER TABLE STOCK
ALTER COLUMN MODELNAME TO NAME;
Ключевое слово TYPE
изменяет тип существующего столбца на другой допустимый тип.Не допустимы любые изменения типа, которые могут привести к потере данных.Например, количество символов в новом типе для столбца не может быть меньше, чем было установлено ранее.
Если столбец был объявлен как массив, то изменить ни его тип, ни размерность нельзя.
Нельзя изменить тип данных у столбца, который принимает участие в связке внешний ключ / первичный (уникальный) ключ.
ALTER TABLE STOCK
ALTER COLUMN ITEMID TYPE BIGINT;
Ключевое слово POSITION
изменяет позицию существующего столбца.Позиции столбцов нумеруются с единицы.
Если будет задан номер позиции меньше 1, то будет выдано соответствующее сообщение об ошибке.
Если будет задан номер позиции, превышающий количество столбцов в таблице, то изменения не будут выполнены, но ни ошибки, ни предупреждения не последуют.
ALTER TABLE STOCK
ALTER COLUMN ITEMID POSITION 5;
Предложение DROP DEFAULT
удаляет значение по умолчанию для столбца таблицы.
Если столбец основан на домене со значением по умолчанию — доменное значение перекроет это удаление.
Если удаление значения по умолчанию производится над столбцом, у которого нет значения по умолчанию, или чьё значение по умолчанию основано на домене, то это приведёт к ошибке выполнения данного оператора.
ALTER TABLE STOCK
ALTER COLUMN MODEL DROP DEFAULT;
Предложение SET DEFAULT
устанавливает значение по умолчанию для столбца таблицы.Если столбец уже имел значение по умолчанию, то оно будет заменено новым.Значение по умолчанию для столбца всегда перекрывает доменное значение по умолчанию.
ALTER TABLE STOCK
ALTER COLUMN MODEL SET DEFAULT 1;
Предложение SET NOT NULL
добавляет ограничение NOT NULL
для столбца таблицы.
Note
|
Успешное добавление ограничения Явное ограничение |
NOT NULL
ALTER TABLE STOCK
ALTER COLUMN PROPID SET NOT NULL;
Предложение DROP NOT NULL
удаляет ограничение NOT NULL
для столбца таблицы.Если столбец основан на домене с ограничением NOT NULL
, то ограничение домена перекроет это удаление.
NOT NULL
ALTER TABLE STOCK
ALTER COLUMN ITEMID DROP NOT NULL;
Для столбцов идентификации позволено изменять способ генерации, начальное значение и значение приращения.
Предложение SET GENERATED
позволяет изменить способ генерации столбца идентификации.Существует два способа генерации столбца идентификации:
BY DEFAULT
столбцы позволяют переписать сгенерированное системой значение в операторах INSERT
, UPDATE OR INSERT
, MERGE
просто указав значение этого столбца в списке значений.
ALWAYS
столбцы не позволяют переписать сгенерированное системой значение, при попытке переписать значение такого столбца идентификации будет выдана ошибка. Переписать значение этого столбца в операторе INSERT можно только при указании директивы OVERRIDING SYSTEM VALUE.
ALTER TABLE objects
ALTER ID SET GENERATED ALWAYS;
Если указано только предложение RESTART
, то происходит сброс значения генератора в ноль.Необязательное предложение WITH
позволяет указать для нового значения внутреннего генератора отличное от нуля значение.
ALTER TABLE objects
ALTER ID RESTART WITH 100;
Предложение SET INCREMENT [BY]
позволяет изменить значение приращения столбца идентификации.Значение приращения должно быть отлично от 0.
ALTER TABLE objects
ALTER ID SET INCREMENT BY 2;
В одном операторе можно изменить сразу несколько свойств столбца идентификации, например:
ALTER TABLE objects
ALTER ID SET GENERATED ALWAYS RESTART SET INCREMENT BY 2;
Предложение DROP IDENTITY
удаляет связанный со столбцом идентификации системную последовательность и преобразует его в обычный столбец.
ALTER TABLE objects
ALTER ID DROP INDENTITY;
Для вычисляемых столбцов (GENERATED ALWAYS AS
или COMPUTED BY
) позволяется изменить тип и выражение вычисляемого столбца.Невозможно изменить обычный столбец на вычисляемый и наоборот.
ALTER TABLE SALARY_HISTORY
ALTER NEW_SALARY GENERATED ALWAYS
AS (OLD_SALARY + OLD_SALARY * PERCENT_CHANGE / 100),
ALTER SALARY_CHANGE COMPUTED
BY (OLD_SALARY * PERCENT_CHANGE / 100);
На данный момент не существует возможности изменить сортировку по умолчанию.
ALTER SQL SECURITY
Предложение ALTER SQL SECURITY
позволяет изменить привилегии с которыми вычисляются вычисляемые столбцы.Если выбрана опция INVOKER
, то вычисляемые столбцы вычисляются с привилегиями вызывающего пользователя.Если выбрана опция DEFINER
, то вычисляемые столбцы вычисляются с привилегиями определяющего пользователя (владельца). По умолчанию вычисляемые столбцы вычисляются с привилегиями вызывающего пользователя.Кроме того триггеры наследуют привилегии выполнения у таблицы, если они не переопределены у самих триггеров.
ALTER TABLE COUNTRY
ALTER SQL SECURITY DEFINER;
Предложение ENABLE PUBLICATION
включает таблицу в набор репликации (публикацию). Соответственно предложение DISABLE PUBLICATION
исключает таблицу из набора репликации.
ALTER TABLE COUNTRY
ENABLE PUBLICATION;
Выполнить оператор ALTER TABLE
могут:
Владелец таблицы;
Пользователи с привилегией ALTER ANY TABLE
.
DROP TABLE
Удаление существующей таблицы.
DSQL, ESQL.
DROP TABLE tablename
Параметр | Описание |
---|---|
tablename |
Имя таблицы. |
Оператор DROP TABLE
удаляет существующую таблицу.Если таблица имеет зависимости, то удаление не будет произведено.При удалении таблицы будут также удалены все триггеры на её события и индексы, построенные для её полей.
DROP TABLE COUNTRY;
Выполнить оператор DROP TABLE
могут:
Владелец таблицы;
Пользователи с привилегией DROP ANY TABLE
.
RECREATE TABLE
Создание новой таблицы или пересоздание существующей.
DSQL.
RECREATE [GLOBAL TEMPORARY] TABLE tablename [EXTERNAL [FILE] 'filespec'] (<col_def> [, <col_def> | <tconstraint> ...]) [ON COMMIT {DELETE | PRESERVE} ROWS] [SQL SECURITY {DEFINER | INVOKER}]
Полное описание определений столбцов и ограничений таблицы смотрите в разделе CREATE TABLE.
Создаёт или пересоздаёт таблицу.Если таблица с таким именем уже существует, то оператор RECREATE TABLE
попытается удалить её и создать новую.Оператор RECREATE TABLE
не выполнится, если существующая таблица имеет зависимости.
RECREATE TABLE COUNTRY (
COUNTRY COUNTRYNAME NOT NULL PRIMARY KEY,
CURRENCY VARCHAR(10) NOT NULL);