|
Программирование >> Построение запросов sql
- ссылочное ограничение (ограничение внешнего ключа); - ограничение проверочного условия . При задании ограничения таблицы можно определить первичный ключ (как простой, так и составной). Если первичный ключ не является составным, то его можно определить при задании ограничения столбца (что было рассмотрено выше), но составной первичный ключ можно определить только с помощью ограничения таблицы. Для этого поля таблицы, являющиеся составным первичным ключом, перечисляются в скобках через запятую в предложении PRIMARY KEY. Аналогично при задании ограничения таблицы можно определить как простой, так и составной внешний ключ, причем если простой ключ уже был определен в ограничении столбца, то определять его снова не требуется. Составной внешний ключ можно определить только с помощью ограничения таблицы, и для этого используется предложение FOREIGN KEY со списком столбцов и предложением REFERENCES c именами содержащих их таблиц, на которые ссылается данный внешний ключ. Использование параметров NO ACTION, CASCADE, SET DEFAULT и SET NULL в предложениях ON DELETE и ON UPDATE аналогично использованию их при определении ограничения столбца (было рассмотрено выше). Таким образом, если определяется простой ключ (первичный или внешний), то его можно задать как в ограничении столбца, так и в ограничении таблицы -результат будет одинаков. Однако если ключ составной, то его можно определить только в ограничении на таблицу. Например, чтобы при создании таблицы NachislSumma определить составной первичный ключ, состоящий из полей NachislFactCD и NachislYear, и внешние ключи AccountCD и GazServiceCD, необходимо применить следующий запрос: CREATE TABLE NachislSumma (NachislFactCD INTEGER NOT NULL, NachislSum NUMERIC(15,2), NachislYear SMALLINT NOT NULL, NachislMonth SMALLINT, AccountCD VARCHAR(6) NOT NULL, GazServiceCD INTEGER NOT NULL, PRIMARY KEY (NachislFactCD, NachislYear), FOREIGN KEY (AccountCd) REFERENCES Abonent(AccountCD), FOREIGN KEY (GazServiceCD) REFERENCES Services(GazServiceCD));. При этом в качестве действия на изменение первичных ключей таблиц Abonent и Services будет определено действие NO ACTION, используемое по умолчанию. При использовании предложения UNIQUE накладывается условие уникальности на значения столбцов таблицы, перечисленных в скобках через запятую. В столбцах с уникальными ограничениями можно использовать NULL значения. Следует учесть, что если в столбцы, на значения которых наложено условие уникальности, пытаться ввести только NULL значения, то они не будут считаться одинаковыми и команда будет выполнена успешно. Создадим, например, таблицу PhoneSprav с четырьмя столбцами: столбец number типа INTEGER, столбец Fio типа VARCHAR(25), столбец HomePhone типа VARCHAR(6) и столбец MobilPhone типа VARCHAR(11). При этом столбец number определим в качестве первичного ключа, а в качестве ограничения на таблицу определим уникальность столбцов HomePhone и MobilPhone. Запрос CREATE TABLE для создания таблицы PhoneSprav примет следующий вид: CREATE TABLE Phone Sprav (number INTEGER PRIMARY KEY, Fio VARCHAR(25), Home Phone VARCHAR(6), Mobil Phone VARCHAR(11), UNIQUE (Home Phone, Mobil Phone));. Если попытаться добавить в таблицу строки (позже будет рассмотрено, как это можно сделать), в которых значения полей number и Fio различны, а поля HomePhone и MobilPhone равны NULL, то вставка этих данных пройдет успешно, так как считается, что каждое (NULL, NULL) в уникальных столбцах (HomePhone, MobilPhone) отличается от любого другого (NULL, NULL). Однако попытка вставить строки с одинаковыми значениями в одном из уникальных столбцов (HomePhone или MobilPhone) и с NULL значениями в другом не удастся. Таким образом, если хотя бы для одного столбца из списка, на который наложено условие уникальности, повторяется значение, отличное от NULL, то запрос не будет выполнен. Ограничение CHECK (<условие проверки>) может использоваться не только при определении отдельного столбца, что было рассмотрено выше, но и в качестве табличного ограничения. Это полезно в тех случаях, когда условие необходимо задать на значениях нескольких столбцов. Синтаксис <условия проверки> фактически повторяет рассмотренный выше для определения ограничения столбца, но могут использоваться имена нескольких различных столбцов таблицы, на которую накладывается ограничение. Предположим, что поступившая ремонтная заявка должна выполняться не позднее, чем через неделю после поступления (т.е. дата выполнения должна быть в диапазоне от дня поступления до даты на 7 дней позднее). Запрос на создание таблицы Request с учетом этого ограничения можно представить в следующем виде: CREATE TABLE Request (RequestCD INTEGER NOT NULL PRIMARY KEY, AccountCD VARCHAR(6) REFERENCES Abonent(AccountCD) ON DELETE CASCADE ON UPDATE CASCADE, ExecutorCD INTEGER, FailureCD INTEGER, IncomingDate DATE, ExecutionDate DATE, Executed SMALLINT, CONSTRAINT ExecDat CHECK (ExecutionDate BETWEEN IncomingDate AND IncomingDate+7));. Следует обратить внимание, что проверяются значения разных столбцов одной и той же строки - нельзя проверить значения более чем в одной строке. Также нельзя использовать ограничение CHECK, например, для того, чтобы указать зависимость даты выполнения одной ремонтной заявки от даты поступления остальных. Предложение [USING [ASC[ENDING] DESC[ENDING]] INDEX имя индекса] будет рассмотрено позднее при изучении индексов. 4.2.4. Удаление таблицы БД Для удаления существующей таблицы используется запрос DROP TABLE, который имеет следующий формат: DROP TABLE базовая таблица;. Следует отметить, что нельзя удалить таблицу в следующих случаях: - если на ее столбцы ссылаются внешние ключи других таблиц; - если она используется другими объектами БД (например, представлением); - если она определена в текущей транзакции, на момент удаления еще не завершенной. При попытке удалить используемую таблицу выдается сообщение об ошибке c SQLCODE=-607 и сообщением, что удаляемый объект еще находится в использовании. 4.2.5. Изменение определения таблицы Созданную запросом CREATE TABLE базовую таблицу можно изменить запросом ALTER TABLE. Он поддерживает следующие изменения: - добавление новых столбцов; - задание нового ограничения целостности для базовой таблицы; - определение нового имени для существующего столбца; - изменение типа данных для существующего столбца; - изменения порядкового номера столбца в таблице; - определение для существующего столбца нового значения по умолчанию (заменяющего предыдущее значение, если оно было); - удаление для столбца существующего значения по умолчанию; - удаление существующего столбца; - удаление существующего ограничения целостности для базовой таблицы.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |