Его элементы означают следующее:
имя_таблицы – имя обновляемой таблицы;
имястолбца – имя обновляемого столбца;
выражение – допустимое в SQL выражение соответствующего типа,
значение которого присваивается обновляемому столбцу;
условие – допустимое в SQL выражение условия, которое используется для отбора обновляемых строк.
По одному предложению UPDATE обновлению подвергаются строки только одной базовой таблицы.
Как видно из определения синтаксиса команды UPDATE, фраза WHERE
является необязательной. При ее отсутствии все строки таблицы подвергаются обновлению согласно фразе SET. Например, для установки всем группам рей-
тинга 0 следует записать следующее выражение:
UPDATE SGROUP
SET Rating = 0;
---
5 строк обновлено.
Во фразе SET можно одновременно изменять значения нескольких столб-
цов таблицы. Например, в следующем примере всем преподавателям увеличи-
вается
ставка на 12 % и надбавка на 7 %:
UPDATE TEACHER
SET Salary = Salary + Salary * 0.12. Rise = Rise + Rise * 0.08;
---
15 строк обновлено.
Во фразе SET в правой части оператора присваивания может использо-
ваться любое допустимое в SQL выражение того же типа, что и столбец, имя которого приведено слева от оператора присваивания. Если в этом выражении используется имя столбца целевой таблицы, для вычисления выражения при-
меняется значение этого столбца в текущей строке, которое было перед обнов-
лением.
71
Обновление по условию использует фразу WHERE. В этом случае обнов-
ляются столбцы только тех строк таблицы, на которых выполняется условие фразы WHERE. Рассмотрим несколько примеров.
Запрос. Увеличить всем ассистентам зарплату и надбавку на 10 %:
UPDATE TEACHER
SET Salary = Salary * 1.1, Rise = Rise * 1.1
WHERE LOWER(Post) = 'ассистент';
---
4 строк обновлено.
Запрос. Установить, что деканат факультета математики переместился в
корпус 7.
UPDATE FACULTY
SET Building = 7
WHERE LOWER(Name) = 'математика';
---
1 строка обновлена.
1.9.4 Удаление существующих строк
Удалять строки из таблицы можно с помощью предложения DELETE. Оно удаляет только строки целиком, а не индивидуальные значения столбцов. Син-
таксис команды следующий:
DELETE FROM имя_таблицы [[AS] синоним]
[WHERE условие];
При использовании предложения DELETE вы прежде всего обнаружите,
что предупреждающая подсказка, как правило, не выдается. Обычно, когда пользователь удаляет какой-либо объект операционной среды, он получает со-
общение типа «Вы уверены (Д/Н)?». В системах, поддерживающих SQL, строки удаляются без такого сообщения. Поэтому будьте внимательны.
В зависимости от применения фразы WHERE предложение DELETE поз-
воляет удалить отдельную строку, несколько или все строки таблицы. Строки могут быть и не удалены. При использовании предложения DELETE помните о следующем:
нельзя удалить значение отдельного столбца (используйте для этого предложение UPDATE);
72
как и предложения INSERT и UPDATE, удаление строк может нарушить ограничения целостности;
сама таблица не удаляется (используйте для этого предложение
DROP TABLE).
Чтобы удалить все содержимое таблицы, не нужно использовать фразу
WHERE. Помните, что вы удаляете не саму таблицу, а только все ее строки.
Запрос. Удалить содержимое таблиц LECTURE.
DELETE FROM LECTURE;
---
22 строк удалено.
Обычно нужно удалять только некоторые строки из таблицы. Чтобы опре-
делить, какие строки будут удалены, нужно использовать условие во фразе
WHERE. Приведем несколько примеров.
Запрос. Из таблицы LECTURE удалить те строки, которые имеют отноше-
ние к занятиям, проводящимся в субботу и воскресенье.
DELETE FROM LECTURE
WHERE LOWER(Day) = 'суб' OR LOWER(Day) = 'вос';
---
0 строк удалено.
Запрос. Удалить аудиторию с первичным ключом 120.
DELETE FROM ROOM
WHERE RomPK = 120;
Здесь RomPK — первичный ключ в таблице ROOM.
1.9.5 Импорт и экспорт данных
Предложения INSERT, DELETE и UPDATE являются чрезвычайно важными для их использования в программах, работающих с базами данных. Эти команды,
совместно с SELECT, образуют основу оперирования базами данных. Однако SQL
не обладает средствами экспорта и импорта данных из других источников.
Например, предположим, что компания на протяжении многих лет вела базу дан-
ных в СУБД ACCESS. В связи с растущими потребностями в распределенной об-
работке данных в клиент-серверной архитектуре появилась необходимость в ис-
пользовании другой более мощной СУБД, например Oracle. Если ваша исходная
73
база данных слишком большая, следует приложить огромные усилия, чтобы с по-
мощью команды INSERT загрузить в Oracle существующую в ACCESS базу дан-
ных. Очевидно, что команды INSERT, DELETE и UPDATE становятся полезны-
ми, когда база данных уже загружена, однако вряд ли вы захотите ввести вручную
400 000 команд INSERT, чтобы перезагрузить существующую базу данных.
Эта проблема решается намного проще в связи с тем, что большинство со-
временных СУБД предоставляют средства экспорта/импорта баз данных. Одни СУБД имеют в своем составе программы-конверторы между собственным форматом хранения данных и форматами баз данных других СУБД. В этом случае при инициировании диалога импорта данных предоставляется возмож-
ность указать формат базы данных, из которой будет производиться импорт.
Другие СУБД позволяют импортировать и экспортировать данные, используя формат текстовых файлов.
Например, СУБД Microsoft Access позволяет экспортиро-
вать/импортировать текстовые файлы и файлы форматов баз данных dBASE, FoxPro и SQL Database: Microsoft SQL Server — текстовые файлы специального формата, a Oracle – данные из текстовых файлов, представляющих записи пе-
ременной или фиксированной длины.
1.9.6 Итоги лекции
Усвоив материал этой лекции, студенты научились:
вставлять в таблицу базы данных отдельные строки, содержащие значе-
ния всех столбцов таблицы;
вставлять в таблицу базы данных отдельные строки, содержащие значе-
ния не всех столбцов таблицы;
изменять порядок перечисления значенийстолбцов во вставляемых строках;
использовать в качестве вставляемых значений выражения;
обновлять значения столбцов во всех строках таблицы;
обновлять значения столбцов в выборочных строках таблицы;
удалять все строки таблицы;
удалять выборочные строки таблицы.
74
1.10 Определение ограничений целостности, ключей, задание прав до-
ступа к данным (17-18)
1.10.1 Аннотация к лекции
Эта лекция посвящена ограничениям целостности - составной части опре-
деления таблицы. С их помощью можно ограничить допустимые значения столбцов, совокупности столбцов, всей таблицы в целом или значений между таблицами. СУБД будет запрещать вводить или обновлять любые значения столбцов таблицы, нарушающие заданные ограничения целостности.
1.10.2 Виды ограничений целостности
Ограничения целостности используются для описания и поддержки дей-
ствующих в предметной области ограничений на возможные значения данных.
После определения ограничения целостности все данные в таблице должны со-
ответствовать тем правилам, которые представлены в этом определении. При последующем выполнении команд SQL по модификации данных в таблице СУБД должна гарантировать, что результирующие данные удовлетворяют ука-
занным ограничениям. Без использования ограничений целостности соответ-
ствующие правила, действующие в предметной области, пришлось бы поддер-
живать с помощью программных средств вашего приложения.
Стандарт SQL допускает при определении таблиц базы данных специфи-
цировать ограничения целостности следующих типов:
[NOT] NULL – допускает или запрещает вставлять строки, которые содер-
жат в столбце неопределенные значения;
UNIQUE – разрешает вставлять в таблицу только такие строки, которые содержат уникальные значения столбца (столбцов);
PRIMARY KEY – ограничение первичного ключа указывает, что все стро-
ки таблицы уникально идентифицируются значениями столбца (столбцов); FOREIGN KEY – ограничение внешнего ключа (или ссылочное) устанав-
ливает, что значения столбца (столбцов) должны соответствовать значениям столбца (столбцов) другой таблицы;
75
CHECK – позволяет задавать для столбца (столбцов) сложные условия на значение, которые должны соблюдаться при манипулировании строками таб-
лицы.
Кроме того, стандарт SQL предоставляет возможность специфицировать самостоятельные, независимые от определения таблиц ограничения целостно-
сти, получившие название утверждений.
Ограничения целостности можно задавать для:
столбца – это ограничение, которое специфицируется относительно зна-
чений конкретного столбца и указывается после определения типа данных столбца (но перед запятой);
таблицы – это ограничение рассматривается как единое для группы столб-
цов и помещается в конец определения таблицы (после последнего имени столбца, но перед заключительной круглой скобкой).
Упрощенный вариант синтаксиса команды CREATE TABLE с указанием ограничений выглядит так:
CREATE TABLE имя_таблицы (
имя_столбца тип_данных ограничения_столбца[,
имя_столбца тип_данных ограничения_столбца]... [,
ограничение_таблицы]...);
Ограничение целостности как столбца, так и таблицы может предваряться фразой CONSTRAINT:
CONSTRAINT имя_ограничения
Она позволяет приписать ограничению имя, по которому в дальнейшем можно ссылаться на это ограничение, например, чтобы его удалить. Эта фраза не является обязательной.
1.10.3 Ограничение на отсутствие значения
Ограничение на отсутствие значения задается с помощью фразы NOT NULL и запрещает использовать в качестве значения столбца неопределенное значение, то есть специальное значение, которое использует СУБД для пред-
ставления неизвестного или неприменимого значения.
76
Вспомним, что NULL — это специальное обозначение, которое отмечает значение столбца как отсутствующее. Если указать фразу NOT NULL сразу по-
сле типа данных столбца, любая попытка поместить значение NULL в этот столбец будет отклонена. Синтаксис ограничения такой:
имя_столбца тип_данных [CONSTRAINT имя_ограничения] NOT NULL
Если фразы NOT NULL в определении столбца нет, SQL предполагает, что значение NULL разрешено (вы можете указать это явно путем задания ограни-
чения NULL).
Важно помнить, что для любого столбца с ограничением NOT NULL
должно быть установлено значение в каждом предложении INSERT или
UPDATE, применяемом к таблице.
При добавлении с помощью инструкции ALTER TABLE новых столбцов с ограничением NOT NULL к уже существующей таблице может возникнуть противоречие. Если к моменту добавления новых столбцов таблица не содер-
жала строк, проблемы не будет. Но если строки уже существуют, какое значе-
ние должна поместить СУБД в создаваемые столбцы? Ведь они, в соответствии с ограничением NOT NULL, должны содержать значение в каждой строке. Од-
но из возможных решений – определить для таких столбцов значение по умол-
чанию.
СОВЕТ. Обратитесь к документации конкретной СУБД, чтобы выяснить предоставляемые возможности решения. Например, в Oracle запрещено добав-
лять к таблице столбцы с ограничением NOT NULL, если таблица уже имеет строки.
Еще одна проблема возникает при добавлении ограничения NOT NULL
для уже существующего столбца (снова при помощи инструкции ALTER TABLE). Если в таблице уже имеются строки, этот столбец уже может содер-
жать значения NULL и тогда устанавливаемое ограничение NOT NULL входит в противоречие с текущими данными
Приведем пример использования ограничения NOT NULL для столбцов таблицы DEPARTMENT:
77
CREATE TABLE DEPARTMENT
(DepPK INTEGER,
FacFK INTEGER NOT NULL.,
Name VARCHAR(30) CONSTRAINT dep_nnl_nam NOT NULL,
Head VARCHARC20));
В первом случае ограничение NOT NULL задано без указания имени огра-
ничения, во втором – с именем.
1.10.4 Ограничение уникальности
Уникальность значения столбца – это ограничение, указывающее, что дан-
ный столбец (или группа столбцов) не может принимать одинаковых значений в пределах таблицы. В некоторых СУБД уникальность значений столбов под-
держивается с помощью создания уникальных индексов, в других она задается независимо от объявления индекса (хотя для того чтобы поддерживать уни-
кальность столбца, для него, как правило, автоматически создается индекс).
Столбец (совокупность столбцов), принимающий уникальные значения,
часто называют уникальным ключом. Если уникальным является один столбец,
он называется простым уникальным ключом, а если несколько – составным уникальным ключом.
Простой уникальный ключ может задаваться и как ограничение столбца, и
как ограничение таблицы. Составной уникальный ключ задается только как ограничение таблицы. Для одной таблицы может быть определено несколько уникальных ключей.
Указание уникальности значений столбца имеет следующий синтаксис:
имя_столбца тип_данных [CONSTRAINT имя_ограничения] UNIQUE
В этом случае СУБД будет отклонять любую попытку ввода в этот столбец значения, которое уже существует в другой строке таблицы. Приведем пример определения уникальности как ограничения столбца:
CREATE TABLE FACULTY
(FacPK INTEGER,
Name VARCHAROO) NOT NULL
CONSTRAINT fac_unq_nam UNIQUE,
Dean VARCHAR(20) CONSTRAINT fac_unq_den UNIQUE,
Building CHAR(5),
Fund NUMBER(7, 2));
78
Обратите внимание, что столбец Name имеет два ограничения: NOT NULL
и UNIQUE. При необходимости определения для столбца нескольких ограни-
чений целостности они могут описываться в произвольном порядке.
Объявление группы столбцов как уникальной отличается от объявления уникальными одного или нескольких отдельных столбцов – для группы столб-
цов уникальной должна быть комбинация их значений, а не индивидуальные значения. Если определяется уникальность группы столбцов, каждый из столб-
цов этой группы уникальным может и не быть. Указание уникальности значе-
ний группы столбцов помещается после описания столбцов и имеет следующий синтаксис:
[CONSTRAINT имя_ограничения] UNIQUE (список_столбцов)
Рассмотрим следующий пример описания уникальности значения сово-
купности столбцов в таблице SGR0UP:
CREATE TABLE SGROUP
(GrpPK INTEGER,
DepFK INTEGER,
Num NUMBER(3) NOT NULL,
Year NUMBERC1) NOT NULL,
CONSTRAINT grp_unq_num_yar_dep UNIQUE (Num, Year, DepFK));
Заданное ограничение уникальности указывает, что на одной и той же ка-
федре (DepFK) не могут быть группы с одинаковыми номерами (Num) в преде-
лах одного курса (Year), однако сами номера групп, курсов и факультетов в пределах таблицы могут повторяться. Более того, могут повторяться комбина-
ции значений любых пар из этих трех столбцов.
1.10.5 Ограничение первичного ключа
Первичный ключ – это столбец (или совокупность столбцов) таблицы, ко-
торый уникально идентифицирует строку таблицы. Первичный ключ очень по-
хож на уникальный ключ – он тоже уникальный, может быть простым и со-
ставным, указываться как в описании столбца, так и для всей таблицы. Однако есть два существенных различия. Во-первых, уникальный ключ может прини-
мать значения NULL, первичный ключ – нет. Во-вторых, таблица может содер-
жать только один первичный ключ.
79
Простой первичный ключ
Синтаксис ограничения первичного ключа имеет следующий вид:
имя_столбца тип_данных [CONSTRAINT имя_ограничения] PRIMARY KEY
Вот как, например, выглядит определение первичного ключа в таблице
ROOM:
CREATE TABLE ROOM
(RomPK INTEGER CONSTRAINT rom_prk PRIMARY KEY, Num NUMBER(3) NOT NULL,
Building CHAR(5) NOT NULL,
Seats NUMBERO),
CONSTRAINT rom_unq_num_bld UNIQUE (Num, Building));
Составной первичный ключ
Составной первичный ключ указывается после определения столбцов. Его синтаксис совпадает с определением уникального ключа, за исключением названия ограничения:
[CONSTRAINT имя_ограничения] PRIMARY KEY (список_столбцов)
Если бы в таблице ROOM первичным ключом являлась пара столбцов
Num и Building, это нужно было бы записать следующим образом:
CREATE TABLE ROOM
(Num NUMBER(3),
Building CHAR(5),
Seats NUMBERO),
CONSTRAINT rom_unq_num_bld PRIMARY KEY (Num, Building));
1.10.6 Ограничение ссылочной целостности
SQL дает возможность поддерживать связь между таблицами с помощью так называемых внешних ключей. Одновременно они обеспечивают ссылочное ограничение целостности, которому посвящен данный пункт.
Внешний ключ и ссылочная целостность
Внешний ключ – это столбец (или совокупность столбцов), с помощью ко-
торого между строками двух таблиц устанавливается связь. Например, для свя-
зи между кафедрами (таблица DEPARTMENT) и факультетами (таблицы
FACULTY) в таблице DEPARTMENT помимо столбцов данных кафедры суще-
ствует дополнительный столбец FacFK, с помощью значений которого указы-
80
