Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Ораклу.doc
Скачиваний:
1
Добавлен:
10.08.2019
Размер:
467.46 Кб
Скачать

Обязательные для заполнения колонки

1. Очистим таблицу счетов.

delete from exdoc;

2. Вспомним структуру таблицы.

desc exdoc

3. Добавим одну запись в таблицу exdoc.

insert into exdoc( doc_nd) values( null);

Одна запись добавлена.

Особенности команды. В списке колонок указали только одну doc_nd, хотя команда desc показала, что в таблице 7 колонок. Для обозначения пустого значения использовали ключевое слово NULL.

Итак, команда добавляет одну запись и присваивает пустое значение одной колонке.

4. Смотрим содержимое таблицы.

select * from exdoc;

На экран выведена шапка таблицы, записей не видно. На самом деле в таблице точно есть одна запись, но все поля имеют значение NULL и поэтому её на экране не видно.

Предыдущая команда INSERT добавила запись, но в ней было задано значение только для одной колонки и в процессе добавления пропущенным колонкам было присвоено тоже значение NULL. Таким образом, команда добавила запись, у которой все колонки имеют значение NULL.

5. Проверим наличие записей другим запросом.

select count(*) from exdoc;

Выведена запись, которая содержит число 1.

Выведенное число – количество записей в таблице exdoc. Команда использует функцию COUNT. Эта функция работает аналогично функции накопительного суммирования SUM. Функция SUM складывает значения, функция COUNT подсчитывает количество значений. Выражение “COUNT(*)” подсчитывает количество записей в таблице.

6. Удалим запись "невидимку".

delete from exdoc;

7. Изменим описание таблицы. Пусть колонка doc_nd будет обязательна для заполнения.

alter table exdoc modify (doc_nd not null);

Получили рапорт: таблица изменена.

Команда ALTER TABLE изменила описание колонки doc_nd в таблице exdoc. Колонка с этих пор не может принимать значение NULL.

8. Запомним команду.

save alt_exdoc1

Пусть поля "Дата счёта" и "Покупатель" обязательны для заполнения. Введём команды, сохраним их в файле.

9. alter table exdoc modify (doc_dd not null);

10. save alt_exdoc2

11. alter table exdoc modify (customer_n not null);

12. save alt_exdoc3

13. Посмотрим ещё раз структуру таблицы exdoc.

desc exdoc

Результат команды desc содержит подсказку – может в колонке содержаться пустое значение или нет. Смотрите столбец “Null?”. Напротив колонок, которые обязательны для заполнения, написано “NOT NULL”.

14. Ну, а теперь можно добавить запись "невидимку"?

insert into exdoc( doc_nd) values( null);

Нет. Получили сообщение об ошибке. Обратите внимание. В сообщении указано, какую колонку надо заполнить.

Дублирование записей

Воспроизведем ситуацию с дублированием записей.

Пусть в таблице счетов будет одна запись из тестового набора. Почистим таблицу; добавим запись; настроем вывод; проверим, что запись есть.

1. delete from exdoc;

2. @ins_exdoc

3. set linesize 512

4. col customer_n for a18

5. col address for a32

6. select * from exdoc;

7. Введём такую команду.

insert into exdoc select * from exdoc;

Получили сообщение: 1 запись добавлена.

Внимательно рассмотрим команду. Это команда добавления записей в таблицу exdoc, но вместо списка колонок и списка значений написан подзапрос.

Команда SELECT будет выбирать записи, команда INSERT будет их добавлять в указанную таблицу. Обращаю внимание. Добавление записей начнется после того, как будет завершена обработка подзапроса.

В этой команде чтение и добавление производится с одной и той же таблицей, т.е. создается копия того, что есть в таблице.

Для команды INSERT опущен список колонок. Это означает, что значения колонок должны быть указаны в том порядке, который задан при создании таблицы. В команде SELECT тоже опущен список колонок. Уже знаем, что символ ”*” вернёт колонки в том порядке, который был указан при создании таблицы.

8. Посмотрим на результат работы команды "INSERT по SELECT’у".

select * from exdoc;

Выведено две записи. Запись, которая была до выполнения команды INSERT, сдублирована.

Итак, команда INSERT может добавлять сразу несколько записей. Для этого используется механизм подзапросов, конструкция "INSERT по SELECT’у"

9. Уже было сказано, что трудно написать "простой SELECT" для доступа к записи, имеющей дубликат. Введём команду.

select distinct * from exdoc;

Выведена только одна запись.

Опция DISTINCT указывает, что нужно выбирать только уникальные записи по указанному списку колонок, т.е. объединять дубликаты. В команде вместо перечисления колонок использовали символ “*”.

10. Попробуем удалить, например, "вторую" запись.

delete from exdoc where doc_nd = 137;

Сообщение: удалено 2 записи.

Как бы не переписывали, запрос всё время будет удаляться обе записи.