Дополнительные возможности обновления данных
Начиная с версии 3.0 вводится дополнительная команда update or insert. Синтаксически она близка к команде insert. update or insert into <object> [(<col_ list>)] values (<val_list>) [matching ([(<col_list>)]
<col_list> ::= <col>[,<col_list>] <val_list> ::= <val>[,<val_list>]
<col> - задает имя столбца <val> - задает значение, присваиваемое столбцу
Оператор update or insert либо обновляет одну или более существующих записей, либо вставляет одну или более новых записей. Производимое действие зависит от значений столбцов в предложении matching или, если оно не указано, то от значений столбцов первичного ключа. Если найдены записи, совпадающие с указанными значениями столбцов в предложении matching, если оно присутствует либо со столбцами первичного ключа в противном случае, то они обновляются. Если нет, то вставляется новая запись. Совпадением считается полное совпадение значений столбцов matching или первичного ключа, причем, если одно из сравниваемых значений null, то и другое также должно быть null. 4.4. Удаление данных. Команда Delete Команда delete удаляет из таблицы или обзора (view) одну или несколько строк в зависимости от задаваемых условий удаления. delete from <table> {[ where <search_condition>]; Исключительное значение в команде delete играет конструкция where, определяющая какие именно строки подлежат удалению. Если она отсутствует, то будут удалены все строки таблицы Пример 4.4.1. Удалим строки из таблицы по значениям первичного ключа. delete from treader where unikey in (84,85,86); Дополнительные возможности команд изменения данных Помимо внесения изменений в командах insert, update, update or insert, delete предусмотрена также возможность возврата значений столбцов. Последнее актуально, когда эти значения заранее не известны, например, вычисляются в результате работы триггеров. Для реализации этой возможности в командах предусмотрена опция returning. Данная опция добавляется в конец соответствующей команды изменения данных. [returning <ret_list> [into <var_list>]]
<ret_list> ::= <ret_val> [[as] <ret_alias>] [, <ret_list>] <ret_val> [[as] <ret_alias>] – задает возвращаемое значение и, при необходимости, его алиасное имя. <var_list> ::= [:]<varnane>[,<var_list>] <varnane> – задает переменную, в которую заносится полученное значение. Применение опции returning допускается только в случае, если соответствующая операция воздействует не более чем на одну строку таблицы. Пример 4.5.1. Если триггер вставки для таблицы TA, содержащей поля KEYTA, field1, field2, field3, формирует значение поля KEYTA, являющегося первичным ключом в таблице TA, то в процедуре, содержащей переменную wKEYTA допустима команда insert into TA(field1, field2, field3) returning KEYTA into wKEYTA;
Работа с DML в Oracle Синтаксис команд DML в Oracle в целом идентичен синтаксису InterBase. В то же время имеется ряд отличий. Рассмотрим некоторые наиболее существенные. Команда select 1. Oracle не поддерживает конструкции skip, first rows, однако Oracle имеет встроенную переменную rownum, которая содержит порядковый номер выбираемой записи Пример 4.6.1. Таким образом, запрос примера 4.1.5. в FireBird
select skip 3 first 2 a. Author, a. BookKey, b. booknm from tbook_author a, tbook b where a.BOOKKEY=b.unikey
в Oracle должен принять вид
select a. Author, a. BookKey, b. booknm from tbook_author a, tbook b where a.BOOKKEY=b.unikey and rownum>3 and rownum<=5 2. Перечень и сигнатура встроенных функций отличаются. Кроме того, Oracle содержит ряд аналитических функций, отсутствующих в FireBird. 3. Oracle не имеет конструкции join в явном виде. Для реализации внешних соединений используется суффикс (+) в конструкции where при описании связей между источниками данных. Так пример 4.1.4. для Oracle нужно переписать в следующем виде Таким образом, запрос примера 4 в FireBird Пример 4.6.2. select a. Author, a. BookKey, b. booknm from tbook_author a left join tbook on a.BOOKKEY=b.unikey
в Oracle должен принять вид
select a. Author, a. BookKey, b. booknm from tbook_author a, tbook where a.BOOKKEY(+) = b.unikey
4. Конструкции case в FireBird и Oracle имеют отличия. В FireBird простой оператор case имеет вид case <test-expr> <when_exp> [else <defaultresult>] end
<when_exp> ::= when <expr> then <result> [<when_exp>] Поисковый case case <when_cond> [else <defaultresult>] end
<when_cond> ::= when <condition> then <result> <when_cond>
В Oracle case <when_cond> [else <defaultresult>] end
<when_cond> ::= when <condition> then <result> <when_cond>
То есть, если конструкция поискового case в FireBird аналогична переключателю switch в C, то конструкция поискового case в FireBird и case в Oracle аналогична группе конструкций if-then-else. В C поисковый case и case Oracle имел бы вид if(<condition1>) result=<result1>; else if(<condition1>) result=<result2>; … else result=< defaultresult>;
5. Источники данных в FireBird и Oracle имеют ряд отличий. Объекты Oracle распределены по схемам, что позволяет держать несколько объектов с одинаковыми названиями, но разного назначения, создавая собственные пространства имен. Соответственно обеспечивается изоляция приложений. В одной и той же базе в зависимости от способа присоединения одно и то же приложение может работать с разными данными. FireBird (InterBase) такую возможность не поддерживает. 6. В качестве источника данных FireBird (InterBase) допускает использование процедуры выбора. Oracle не имеют объектов типа процедур выбора. 7. Oracle поддерживает команду truncate, обеспечивающую быструю очистку таблиц и кластеров (в определенном смысле групп таблиц). 8. Oracle поддерживает также ряд команд и функций, предназначенных для реализации бизнес – правил в базе данных, однако их рассмотрение выходит за рамки данной книги. Встроенные функции Функции, как в любом языке программирования могут получать несколько (в том числе и 0) параметров и возвращают результат специфицированного типа. В отличие от ранних версий InterBase список функций, включенных в состав FireBird достаточно велик. Встроенные функции по характеру аргументов и назначению можно разбить на несколько групп. По характеру аргументов функции подразделяются на агрегатные и скалярные. Агрегатные функции используются либо для подсчета общих итогов по всей выборке, либо вместе с конструкцией group by. К скалярным относятся встроенные математические функции, функции для работы со строками, функции для работы с датами, функции преобразования типов, побитовые функции, функции для работы с UUID, функции для работы с генераторами, условные функции. Отметим только, что список встроенных функций может отличаться в различных версиях сервера. Кроме того, везде, где по синтаксису допустимы функции, можно использовать пользовательские внешние функции, которые должны быть предварительно помещены в соответствующие библиотеки и продекларированы в базе данных. Начиная с 3 версии FireBird пользовательские функции можно также писать средствами языка SQL и помещать в базу аналогично процедурам и триггерам.
К агрегатным относятся следующие функции: count (*|[all] <val> | distinct <val>) – количество строк; sum ([all]<val>|distinct <val>) – сумма значений; avg ([all] <val> | distinct <val>) – среднее значение; max ([all] <val> | distinct <val>) – максимальное значение; min ([all] <val> | distinct <val>) – минимальное значение.
К математическим функциям относятся следующие: abs(<x>); atan(<x>); acos(<x>); asin(<x>); ceil(<x>) или ceiling(<x>); cos(<x>); cosh(<x>); cot(<x>) (ctg x); exp(<x>); floor(<x>); ln(<x>); log(<x>); mod(<x>,<y>); pi(); power(<x>,<y>); rand(); round(<x>,<m>); sign(<x>); sin(<x>); sinh(<x>); tan(<x>); tanh(<x>); trunc(<x>,<m>) Здесь <x>, <y> - числовые выражения; <m> - целые. К строковым относятся следующие функции: ascii_char (<code>) , ascii_val(<ch>); bit_length (<str>); char_length (<str>) или character_length (<str>); hash (<str>); left (<str>, <num>); lower (<str>); lpad(<str>, <endlen>[, <padstr>]); octet_length(<str>); overlay (<string> placing <replacement> from <pos> [for <length>]); position (<find> in <text>); replace(<str>, <find>, <repl>); reverse(<str>); right (<str>, <num>); substring (<str> from <startpos> [for <length>]); trim ([[{both | leading | trailing | ''}] [<strwhat>] from] <strfrom>); upper(<str>) <code> - целое в диапазоне 0 – 255; <ch> - отдельный символ или строка (в строке используется первый символ). <str>, <string>, <replacement>, <padstr>, <find>, <text>, <repl>, <startpos>, <strwhat>, <strfrom> - строка символов. <endlen>, <pos>, <length>, <num> - целые. К функциям для работы с датой и временем относятся следующие: dateadd (<par_list>) (<par_list> ::= <nm> <unit> to <datetime> <unit> ={year | month | week | day | weekday | yearday | hour | minute | second | millisecond} <nm> – числовой параметр, <datetime> – параметр типов date, time или timestamp. Возвращает результат в формате третьего параметра.
datediff (<par_list>) <par_list> ::= <unit> from <datetime1> to <datetime2> <unit> ={year | month | week | day | weekday | yearday | hour | minute | second | millisecond} <datetime1>, <datetime2> – параметр типов date, time или timestamp Возвращает результат в числовом формате.
extract (<unit> from <datetime>) <unit>:: ={year | month | week | day | weekday | yearday | hour | minute | second | millisecond} <datetime> – параметр типов date, time или timestamp Возвращает результат в числовом формате.
К функциям преобразования типов относится функция cast. cast(<val> as <datatype>) Возвращает результат в формате, заданном вторым параметром (практически любой поддерживаемый тип).
К функциям для работы с UUID относятся char_to_uuid, gen_uuid, uuid_to_char
К функциям для работы с генераторами (последовательностями) относится функция GEN_ID.
gen_id(<gen_name>, <step>)
<gen_name> – имя генератора (последовательности), <step> – приращение генератора (обычно 1) Возвращает накопленное значение (0, 1, 2 …), в результате обращения накопленное значение увеличивается на величину приращения (<step>). Накопленное значение увеличивается при всяком обращении вне зависимости от того в рамках какой транзакции оно выполнено, что гарантирует уникальность возвращаемых значений. Функция gen_id используется, главным образом, для генерации автоинкрементных ключей.
К условным функциям относятся следующие:
decode(<testexpr>, <expr1>, <result1> [, <expr2>, <result2> ...] [, <defaultresult>])
decode эквивалентна конструкции case
case <testexpr> when <expr1> then <result1> [when <expr2> then <result2> … else <defaultresult>] end Синтаксис конструкции case см. ниже.
iif(<condition>, <res_true>, <res_false>) Возвращает <res_true>, если условие (<condition>) выполнено и <res_false> в противном случае. Аналог оператора C ((condition) ? res_true : res_false;
maxvalue(<expr1> [, <exprn> ...]) Возвращает максимальное значение из <expr1>… <exprn>
minvalue(<expr1> [,<exprn> ...]) Возвращает минимальное значение из <expr1>… <exprn>
nullif(<expr1>, <exprn>) Функция возвращает значение первого аргумента, если он неравен второму. В случае равенства аргументов возвращается NULL. Чаше встречается обратная задача: заменить NULL на некоторое значение. Последнее реализуется конструкцией iif(<expr1> is NULL, <expr1>, <expr2>) Отметим, что в Oracle для этого предусмотрена функция nvl c синтаксисом nvl(<expr1>, <expr2>) Функция возвращает значение <expr1>, если оно отлично от NULL, иначе <expr2>.
К функциям побитовых операций относятся следующие:
bin_and (<number> [, <number> ...]) Функция bin_and возвращает результат побитовой операции and аргументов. bin_not (<number>) Функция bin_not возвращает результат побитовой операции not аргумента. bin_or (<number> [,<number> ...]) Функция bin_or возвращает результат побитовой операции or аргументов. bin_shl (<number>, <shift>) Функция bin_shl возвращает результат побитовой операции сдвига влево первого аргумента на количество бит, заданное вторым. bin_shr (<number>, <shift>) Функция bin_shr возвращает результат побитовой операции сдвига вправо первого аргумента на количество бит, заданное вторым. bin_xor (<number> [,<number> ...]) Функция bin_xor возвращает результат побитовой операции xor аргументов
Глава 5. Описание данных на основе SQL 5.1. Организация данных в InterBase. Типы данных Данные в реляционных базах данных, в частности в InterBase, хранятся в плоских таблицах. В каждом столбце таблицы хранятся данные одного типа. При этом нужно помнить, что данные, по которым осуществляется поиск, должны быть простого (неструктурированного) типа, для которого определены операции сравнения. Данные других типов допускаются, если можно так сказать, "в порядке исключения" и для работы с ними используются средства, выходящие за пределы стандарта SQL. Приведем перечень используемых в InterBase типов данных. smallint – слово, короткое целое (2-байтовое) со знаком. integer – двойное слово, длинное целое (4-байтовое). bigint – (8-байтовое) целое, доступен только в 3-м диалекте. boolean - булевский однобайтовый, допустимые значения true, false, null; может непосредственно использоваться в логических выражениях (поддерживается, начиная с версии 3.0). float – числа с плавающей точкой одинарной точности (4 байта) – 7 значащих цифр. double precision – числа с плавающей точкой двойной точности (8 байтов) – 15 значащих цифр. decimal (размер, точность) / (размер, точность). Размер переменной (от 1 до 15) указывает гарантированную точность переменной, то есть число значащих цифр. Точность (от 1 до 15) задает число цифр после запятой (должно быть меньше или равно размеру). Например, decimal (10,3) содержит числа в формате: ppppppp.sss Типы данных decimal и numeric имеют смысл только для внешнего представления данных. В базе они реально хранятся в одном из основных числовых форматов (smallint, integer, float или double precision). Конкретный формат выбирается исходя из размера, указанного в decimal (numeric). date (8 байт) c 1.01.100 до 29.02.32768, включает также данные о времени в диалекте 1; в диалекте 3 – только дата. time – время (только в диалекте 3) timestamp – дата и время (только в диалекте 3) – аналог date в диалекте 1. char (n) / character (n) n символов (от 1 до 32 767 байт) – строка фиксированной длины; максимальная длина – 32К. character varying(n) / varchar(n) / char varying(n) n символов (от 1 до 32 767 байт) – строка переменной длины; максимальная длина – 32К. nchar(n) / national character(n) / national char(n) n символов (от 1 до 32 767 байт) – строка фиксированной длины, использующая кодовый набор ISO8859_1. nchar varying(n) / national character varying(n) / national char varying(n) n символов (от 1 до 32 767 байт) – строка переменной длины, использующая кодовый набор ISO8859_1. unicode – символьный формат; 1 символ занимает от 1 до 4 байт. blob [sub_type {int | subtype_name}] [segment size int] [character set charname] / blob [(seglen [, subtype])]. sub_type содержит код типа хранимых в blob данных. segment size – размер блока, через который осуществляется чтение-запись данных blob в приложениях, использующих embedded SQL. Все перечисленные типы данных, кроме blob, могут быть организованы в массивы. Массивы могут содержать от 1 до 16 измерений. При необходимости размеры массива по каждому из измерений указываются в квадратных скобках. Например, VesMes[12], Abc[10,4,5]. Границы по измерению могут быть указаны явно, например VesT[5:8]. В этом случае массив будет состоять из четырех элементов: VesT[5], VesT[6], VesT[7], VesT[8]. Заметим, что массив не может быть элементом массива. Нумерация элементов массива начинается с 1, если границы не были заданы явно. 5.2. Домены Столбцы в различных таблицах базы данных могут содержать однотипные данные. Кроме того, виды контроля этих данных также могут быть одинаковыми. В этих условиях описания данных и методов их контроля целесообразно выполнить один раз, тогда при описании таблиц достаточно указывать только имя соответствующего описания данных. Для этих целей и служат описания доменов. (Напомним, что под доменами отношения R, где R ÌA1 ´ A2 ´… ´An , понимаются множества Ai i Î[1, n].) Перед тем как создавать столбцы, которые ссылаются на домены, необходимо задать описания доменов. Для этих целей существует команда create domain. В результате ее выполнения создается шаблон, на который можно ссылаться в командах создания и модификации таблиц (create table и alter table). Наиболее полезно использование доменов, когда большое число таблиц содержит идентичные типы данных. Столбцы, базирующиеся на доменах, наследуют все характеристики домена, причем часть из них может быть переопределена в локальных описаниях столбцов. Поскольку описания доменов не связаны ни с какими таблицами, то ограничения логической целостности таблиц, естественно, не могут фигурировать в описании доменов. Рассмотрим синтаксис описания доменов. Создание доменов create domain строит описание столбца, которое используется как шаблон при описании столбцов таблиц в командах create table или alter table. Описание домена содержит следующий набор характеристик: тип данных и необязательные значение по умолчанию, запрет значений null, контрольное ограничение (check), порядок сравнения (понятие >, =, < для строк). Столбцы, базирующиеся на описании домена, наследуют все его характеристики. create domain <domain> [as] <datatype> [default {<literal> | null | user | <con_var> }] [not null] [check (<dom_search_condition>)] [collate <collation>];
<domain> - уникальное имя создаваемого домена <datatype> ::= { { smallint | integer | bigint | float | double precision | boolean} [<array_dim>] | {decimal | numeric } [(<precision> [, <scale>])] [<array_dim>] | date [<array_dim>] | {char | character | character varying | varchar | unicode} [(1...32767)] [<array_dim>] [character set <charname>] | {nchar | national character | national char} [varying] [(1...32767)] [<array_dim>] | blob [sub_type {<num_int> | <subtype_name>}] [segment size <seg_size>] [character set <charname>] | blob [(<seglen> [,<subtype>])] }
<precision> - количество десятичных знаков, занимаемое числом <scale>> - количество десятичных знаков в дробной части числа <array_dim> ::= [x:y [, x:y ...]] Здесь внешние квадратные скобки являются частью синтаксиса описания массивов, а не элементом метаязыка. Массивы, в общем случае, не являются стандартным типом SQL и здесь не рассматриваются. Доступ к ним возможен только внутри программных объектов (процедуры, функции, триггеры, блоки кода). <charname> - задает набор символов по умолчанию sub_type {<num_int> | <subtype_name>} – задает номер или мнемонику подтипа blob segment size <seg_size> - задает размер сегмента blob (blob при хранении разбивается на сегменты), размер не более 65535 байт. default - Указывает значение, которое будет присвоено столбцу, если не было прямого присвоения. Значения по умолчанию могут быть переопределены при описании столбцов таблиц. <literal> - константа соответствующего типа <con_ var> ::= {current_connection | current_transaction | current_role | current_date | current_time | current_timestamp | 'now' | 'today' | 'yesterday' | 'tomorrow' | current_user | user} not null - Указывает, что вводимые в столбец данные не могут принимать значение null check (<dom_search_cond>) - Добавляет check -ограничение в домен. Домен может иметь только одно check - ограничение
<dom_search_condition> ::= { | <val> [not] similar to <val> [escape <val>] | <val> <operator> {all | some | any} (<select_list>) | [not] exists (<select_expr>) | [not] singular (<select_expr>) value - Заменитель имени столбца, основанного на домене <operator> ::= {= | < | > | <= | >= | !< | !> | <> | !=} <list_val>> ::= <val> [, <list_val>] <val> - константное выражение
collate <collation> - Определяет порядок сравнения для домена. <select_list>, <select_expr> - задают выборку данных из базы. Конструкция collate неприменима для blob столбцов.
Пример 5.2.1. create domain dmonth as smallint check (value between 1 and 12); Замечание. Тип данных не может быть переопределен при использовании домена в описании таблиц. Изменение доменов Изменение доменов осуществляется командой alter domain. С помощью команды alter domain можно изменить любые характеристики домена, кроме типа данных (включая размеры массива) и установок not null. Сделанные изменения воздействуют на поля всех таблиц, где использовался измененный домен. alter domain <name> {[ set default {<literal> | null | user}]|[drop default] | [add [constraint] check ( <dom_search_condition>)] | [drop constraint]}; Удаление доменов Удаление доменов осуществляется командой drop domain. С помощью этой команды можно удалить описание домена. Если домен используется в каких-либо таблицах, то удалить его нельзя (соответствующая команда завершится аварийно).
Пример 5.2.2. drop domain dmonth; 5.3. Таблицы Перед тем как перейти к созданию таблиц, необходимо выполнить проектирование базы данных и нормализацию таблиц. Далее следует определить, какие таблицы и с какими столбцами (полями) подлежат созданию. Создать, если это не было сделано ранее, саму базу и выполнить команду соединения с базой (см. create database … и connect). Создать комплект необходимых доменов и только после этого можно перейти к физическому вводу описаний таблиц. Создание таблицы, точнее, ее описания и «пустографки» осуществляется командой create table. При создании таблицы мы должны задать, как минимум, ее имя и перечень полей с их атрибутами и контрольными ограничениями. Кроме того, при создании таблицы можно задать ее первичный ключ, внешние ключи, задающие требования по поддержанию логической целостности, дополнительные виды контроля на уровне записей. Создание таблиц. Команда CREATE TABLE create table описывает создаваемую таблицу, ее столбцы, ограничения логической целостности в существующей базе. create [global temporary] table <table_name> [external [file] '<filespec>'] (<list_def>]) [on commit {delete | preserve} rows]; <table_name> - Имя таблицы. Имя должно быть уникальным внутри базы в списке имен таблиц и процедур <list_def>::={<col_def> | <tconstraint>}[,<list_def>] <col_def> ::= <col> {datatype | {computed [by] | generated always as} <expr>) | <domain>} [default {<literal> | null | user}] [not null] [<col_constraint>] [collate <collation>] <col> - Имя столбца. Имя должно быть уникальным внутри таблицы в списке имен столбцов <datatype> - Тип данных для столбца (см. create domain). <expr> = любое корректное SQL выражение, возвращающее отдельную величину (blob и массив не допускаются). computed [by] (<expr>) или generated always as (<expr>) - описывает вычисляемый столбец. Конструкция <expr> задает порядок вычисления. <expr> может быть любым допустимым в SQL выражением, возвращающим единственное значение (массивы и blob недопустимы). Все столбцы, участвующие в вычислении, должны существовать на момент ввода вычисляемого столбца
<domain> - Имя домена, на который опирается описание столбца default, collate <collation> - имеют тот же смысл, что и при описании домена. <col_constraint> ::= [constraint <constraint_name>] <constraint_def> <constraint_name> - имя ограничения <constraint_def> ::= {unique [<using_index>]| primary key [<using_index>]| check (<dom_search_cond>) | references <other_table> [(other_col)] [<using_index>][on delete { no action | cascade | set default | set null}] [on update {no action | cascade | set default | set null}]} unique – задает уникальный индекс primary key - задает первичный ключ check – задает способ контроля <tconstraint> ::= constraint <constraint_name> <tconstraint_def> <tconstraint_def> = {{ primary key | unique } (<list_col>) [<using_index>] | foreign key (<list_col>) references <other_table> [<using_index>] | check (<search_condition>)} <list_col> ::= <col> [,(<list_col>] <search_condition> - см. select. <constraint_name> - имя ограничения <using_index> ::= using [asc[ending] | desc[ending]] index <indexname>
Необязательное предложение external [file] указывает, что таблица хранится вне базы данных во внешнем текстовом файле в жестком формате без разделителей. Для таких таблиц возможны только операции вставки и выборки. Их можно использовать для хранения данных типа журнала, независимого от основной базы данных. Необязательное предложение global temporary указывает, что таблица не предназначена для постоянного хранения данных. Таблица предназначена для хранения промежуточных результатов. Время хранения задается предложением on commit {delete | preserve} rows, определяющим момент очистки таблицы. В режиме delete таблица «живет» одну транзакцию. Такая конструкция оправдана, прежде всего, когда в пределах процедуры вычисляются некоторые данные, обрабатываются и, наконец, записываются в постоянные таблицы. Режим preserve используется, когда в рамках одной транзакции данные формируются, а используются, возможно многократно, другими транзакциями. Время «жизни» такой таблицы определяется соединением. В обоих случаях это означает, что одновременно может существовать несколько локальных экземпляров таблиц, используемых различными приложениями. Режим по умолчанию - on commit delete rows, если нужен другой режим, его следует указывать явно. Предложение <col> <datatype>необходимо для задания всех хранимых данных, именно на их основе определяется объем и структура требуемой памяти. Конструкция computed [by] или generated always as указывает, что описываемое поле не хранится в базе, а задается лишь алгоритм для его вычисления. Если в операторе SQL, работающем с таблицей данное поле не используется, то не включаются и средства для его вычисления, таким образом, наличие вычисляемых полей не замедляет доступ к данным. Остальные опции отвечают за контроль корректности данных и логическую целостность таблицы. Ограничения на отдельный столбец типа primary, unique, foreign key указывают, что данное поле служит первичным, уникальным, внешним ключом. Ограничения на отдельный столбец типа check, задают область допустимых значений поля, синтаксис этой конструкции совпадает с синтаксисом check для доменов. Ограничения на таблицу типа primary, unique, foreign key позволяют указать набор полей, образующих первичный, уникальный, внешний ключ <using_index> - задает необходимость формирования индекса и задает его режимы: возрастание (по умолчанию) или убывание. Ограничения на таблицу типа check, позволяет задать условие проверки, зависящее от нескольких столбцов. Пример 5.3.1. Создается таблица с первичным, 2 внешними ключами (на уровне поля и на уровне таблицы) и 2 вычисляемыми полями. create table tbook_author1 ( Модификация таблиц. Команда ALTER TABLE Команда alter table предназначена для изменения структуры уже существующих таблиц. Она позволяет: • добавить в таблицу новый столбец; • удалить из таблицы существующий столбец; • добавить в таблицу ограничение на столбец или таблицу; • удалить из таблицы ограничение на столбец или таблицу. В одной команде alter table можно задать любое число изменений. Модификация таблицы, особенно если она содержит данные и связана с другими таблицами, является потенциально опасной операцией. Поэтому прежде чем приступить к изменению таблицы, необходимо продумать схему внесения изменений. alter table <table_name> <list_oper> <list_oper> ::= <operation> [,<list_oper>]; <operation> ::= {add {<col_def> | <tconstraint>} | drop {<col> | constraint <constraint>} Конструкции <col_def>, <tconstraint>, <col>, <constraint> в команде alter table полностью соответствуют аналогичным элементам описания столбцов или ограничений при создании таблиц (create table). В результате ее выполнения создается или удаляется соответствующий элемент описания таблицы. Удаление таблиц. Команда DROP TABLE Команда dpop table предназначена для удаления таблиц. drop table <table_name>; < table_name> – имя удаляемой таблицы. В результате выполнения команды drop table удаляется содержимое таблицы, ее описание, все связанные с таблицей индексы и триггеры. Если в базе есть ссылки на удаляемую таблицу из других таблиц, обзоров, ограничений логической целостности, то удаление не выполняется. Кроме того, удаление также не будет выполнено, если имеется активная транзакция, работающая с удаляемой таблицей. 5.4. Индексы Индексы предназначены для ускорения поиска данных на запросы в соответствии с заданными условиями. Кроме того, индексы могут использоваться для контроля уникальности ключевых выражений. В определенном смысле индекс является аналогом оглавления или алфавитного указателя, то есть по его значению мы сразу находим интересующие строки таблиц. В индексе хранятся значения индексированного столбца или столбцов наряду с указателями на все дисковые блоки, которые содержат строки с соответствующими значениями. При выполнении запроса определяется список индексов, связанных с данной таблицей. Затем устанавливает, что является более эффективным, просмотреть всю таблицу или для обработки запроса использовать существующий индекс. Если решено использовать индекс, то поиск ведется сначала по ключевым значениям в индексе, а затем, используя указатели, осуществляется просмотр самих таблиц для дополнительной фильтрации и окончательной выборки требуемых данных. Поиск осуществляется достаточно быстро, поскольку значения в индексе упорядочены, а сам индекс относительно невелик. Это позволяет найти ключевое
Популярное: Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (239)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |