Лекции и практики (1). Курс лекций и материалы для практических занятий
Скачать 1.01 Mb.
|
Создание таблицСоздание нового пустого отношения (таблицы) выполняется с помощью команды DDL CREATE TABLE. Упрощённый синтаксис этой команды: CREATE TABLE <имя таблицы> ( <имя поля1> <тип данных> [ (<размер>) ] [ [NOT] NULL] [ DEFAULT <выражение> ] [<ограничения целостности поля>…] [, <имя поля2> <тип данных> [ (<размер>) ] [ [NOT] NULL] [ DEFAULT <выражение> ] [<ограничения целостности поля>] .,..] [, <ограничения целостности таблицы>] ); Расшифровка элементов описания приведена в табл. 3.1. Таблица 3.1. Описание элементов команды CREATE TABLE
Если размер поля не указан, то принимается значение, принятое в данной СУБД по умолчанию для указанного типа. Для всех СУБД точность для число- вых типов по умолчанию равна 0, размер поля типа CHAR по умолчанию равен 1, а для типа VARCHAR размер указывать обязательно. Для типа DATE поддерживается арифметика дат, например: (<текущая дата> + 1) – завтра (<дата1> – <дата2>) – количество дней, прошедших между двумя датами; (<текущая дата> + 1/24) – через час (для типа дата-время). Получить текущую дату можно с помощью специальной функции, имя которой зависит от СУБД: sysdate – для Oracle; now() – для Access и MySQL; getdate() – для MS SQL Server и т.д. Стандарт SQL включает понятие неопределённого или неизвестного зна- чения – NULL-значения. Для обязательных полей устанавливается ограничение NOT NULL. Это означает, что при изменении значения этого поля или при до- бавлении новых записей таблицы значение этого поля не может быть неопреде- ленным (NULL). Ограничение NOT NULL можно наложить на поле только один раз, иначе возникает ошибка. Для любого поля с помощью конструкции DEFAULT <выражение> мо- жет быть задано значение по умолчанию. Оно используется в тех случаях, ко- гда при добавлении данных в таблицу значение этого поля не указывается. Для ограничений целостности можно задавать имена: CONSTRAINT <имя> <ограничение целостности> Примерысозданиятаблиц: Таблица "Отделы" с полями "Номер отдела" (ПК), "Название отдела": CREATE TABLE depart ( depno NUMERIC(2) CONSTRAINT pk_dep PRIMARY KEY, name VARCHAR(80) NOT NULL); Таблица "Сотрудники" с полями "Номер отдела" (внешний ключ), "Табель- ный номер сотрудника" (ПК), "ФИО сотрудника", "Должность", "Оклад", "Дата рождения", "Телефон", "Дата поступления на работу": CREATE TABLE emp (depno NUMERIC(2) CONSTRAINT ref_dep REFERENCES depart, tabno CHAR(5) CONSTRAINT pk_emp PRIMARY KEY, name VARCHAR(50) NOT NULL, post VARCHAR(35) NOT NULL, salary NUMERIC(7,2) NOT NULL CONSTRAINT check_salary CHECK (salary > 4600), born DATE NOT NULL, phone CHAR(11), edate DATE DEFAULT trunc(sysdate)); Примечание: функция sysdate возвращает дату и время, поэтому следует с помощью функ- ции trunc (сокращение от truncate) устанавливать время в 0 часов, 0 минут, 0 секунд. Таблица "Дети сотрудников" с полями "Табельный номер родителя" (внеш- ний ключ), "Имя ребенка", "Пол", "Дата рождения": CREATE TABLE children ( tabno CHAR(5) CONSTRAINT ref_emp REFERENCES emp(tabno), name VARCHAR(50) NOT NULL, sex CHAR, born DATE, CONSTRAINT pk_child PRIMARY KEY (tabno, name), /* составной первичный ключ */ CONSTRAINT check_sex CHECK (sex IN ('м', 'ж'))); Обратитевнимание: общие ограничения целостности и составные ключи указываются через запятую после последнего поля; если внешний ключ ссылается на первичный ключ (ПК) другого отноше- ния, имена полей ПК можно не указывать (см. создание таблицы emp); типы полей внешнего ключа должны совпадать с типами полей первич- ного (или уникального) ключа, на который он ссылается; если внешний ключ составной, список полей входящий в ключ, указыва- ется после перечисления всех полей таблицы с ключевым словом FOREIGN KEY: create table exam -- "Расписание зачетов", основная таблица ( eclass NUMERIC(3), -- аудитория edate DATE, -- дата edisc VARCHAR(60), -- дисциплина UNIQUE (eclass, edate)); create table tab -- "Зачеты", подчинённая таблица ( tid NUMERIC(6) PRIMARY KEY, tclass NUMERIC(3), -- аудитория tdate DATE, -- дата tgroup CHAR(6), -- группа FOREIGN KEY (tclass, tdate) REFERENCES exam(eclass, edate)); При выполнении команды создания таблицы в общем случае СУБД дела- ет следующее: Проверяет команду на синтаксическую правильность: если есть ошибки, выдаёт пользователю сообщение о первой выявленной ошибке, иначе пе- реходит к следующему пункту. Проверяет права пользователя, который запустил эту команду: если права на выполнение подобной операции есть, то переходит к следующему пункту, иначе – выдаёт сообщение о недостаточности прав. Записывает в словарь-справочник данных сведения о создаваемой табли- це (имя, перечень полей с типами данных, размерами и ограничениями целостности, а также некоторую дополнительную информацию). Создаёт отдельный файл для хранения данных или выделяет отдельную область памяти (это зависит от того, как конкретная СУБД хранит дан- ные; подробнее об этом рассказано в главе 5. "Физическая организация баз данных"). Создаёт дополнительные объекты базы данных, связанные с данной таб- лицей (например, индексы, о которых рассказано также в главе 5). |