Календарные типы данных
Тип данных | Объем памяти | Диапазон | Описание |
DATE | 3 байта | от '1000-01-01' до '9999-12-31' | Предназначен для хранения даты. В качестве первого значения указывается год в формате «YYYY», через дефис – месяц в формате «ММ», а затем день в формате «DD». В качестве разделителя может выступать не только дефис, а любой символ отличный от цифры. |
TIME | 3 байта | от '– 838:59:59' до '838:59:59' | Предназначен для хранения времени суток. Значение вводится и хранится в формате – hh:mm:ss, где hh – часы, mm – минуты, ss – секунды. В качестве разделителя может выступать любой символ отличный от цифры. |
DATATIME | 8 байт | от '1000-01-01 00:00:00' до '9999-12-31 23:59:59' | Предназначен для хранения и даты и времени суток. Значение вводится и хранится в формате – YYYY-MM-DD hh:mm:ss. В качестве разделителей могут выступать любые символы отличные от цифры. |
TIMESTAMP | 4 байта | от '1970-01-01 00:00:00' до '2037-12-31 23:59:59' | Предназначен для хранения даты и времени суток в виде количества секунд, прошедших с полуночи 1 января 1970 года (начало эпохи UNIX). |
YEAR (M) | 1 байт | от 1970 до 2069 для М = 2 и от 1901 до 2155 для М = 4 | Предназначен для хранения года. М – задает формат года. Например, YEAR (2) – 70, а YEAR (4) – 1970. Если параметр М не указан, то по умолчанию считается, что он равен 4. |
Тип данных NULL
Вообще-то это лишь условно можно назвать типом данных. По сути это скорее указатель возможности отсутствия значения. Например, при регистрации на каком-либо сайте предлагается заполнить форму, в которой присутствуют, как обязательные, так и необязательные поля. Понятно, что регистрация пользователя невозможна без указания логина и пароля, а вот дату рождения и пол пользователь может указать по желанию. Для того чтобы хранить такую информацию в БД и используют два значения: NOT NULL (значение не может отсутствовать) для полей логин и пароль, NULL (значение может отсутствовать) для полей дата рождения и пол. По умолчанию всем столбцам присваивается тип NOT NULL, поэтому его можно явно не указывать.
Пример: create table users (login varchar(20), password varchar(15), sex enum('man', 'woman') NULL, date_birth date NULL);
Таким образом, будет создана таблица с 4 столбцами:
· логин (не более 20 символов) обязательное;
· пароль (не более 15 символов) обязательное;
· пол (мужской или женский) не обязательное;
· дата рождения (тип дата) необязательное.
Пример
База данных для форума имеет вид:
Начнем с таблицы users (пользователи). В ней 4 столбца:
· id_user – целочисленные значения, значит будет тип int, ограничим его 10 символами – int (10).
· name – строковое значение varchar, ограничим его 20 символами – varchar(20).
· email – строковое значение varchar, ограничим его 50 символами – varchar(50).
· password - строковое значение varchar, ограничим его 15 символами – varchar(15).
Все значения полей обязательны для заполнения, значит надо добавить тип NOT NULL:
id_user int (10) NOT NULL
name varchar(20) NOT NULL
email varchar(50) NOT NULL
password varchar(15) NOT NULL
Первый столбец, как следует из концептуальной модели БД, является первичным ключом (т.е. его значения уникальны, и они однозначно идентифицируют запись). Следить за уникальностью самостоятельно можно, но не рационально. Для этого в SQL есть специальный атрибут – AUTO_INCREMENT, который при обращении к таблице на добавление данных высчитывает максимальное значение этого столбца, полученное значение увеличивает на 1 и заносит его в столбец. Таким образом, в этом столбце автоматически генерируется уникальный номер, а, следовательно, тип NOT NULL излишен.
Итак, присвоим атрибут столбцу с первичным ключом:
id_user int (10) AUTO_INCREMENT
name varchar(20) NOT NULL
email varchar(50) NOT NULL
password varchar(15) NOT NULL
Теперь надо указать, что поле id_user является первичным ключом. Для этого в SQL используется ключевое слово PRIMARY KEY (), в скобках указывается имя ключевого поля.
Внесем изменения:
id_user int (10) AUTO_INCREMENT
name varchar(20) NOT NULL
email varchar(50) NOT NULL
password varchar(15) NOT NULL
PRIMARY KEY (id_user)
Итак, таблица готова, и ее окончательный вариант выглядит так:
create table users (id_user int (10) AUTO_INCREMENT, name varchar(20) NOT NULL, email varchar(50) NOT NULL, password varchar(15) NOT NULL, PRIMARY KEY (id_user));
Теперь разберемся со второй таблицей – topics (темы). Рассуждая аналогично, имеем следующие поля:
id_topic int (10) AUTO_INCREMENT
topic_name varchar(100) NOT NULL
id_author int (10) NOT NULL
PRIMARY KEY (id_topic)
Но в модели БД поле id_author является внешним ключом, т.е. оно может иметь только те значения, которые есть в поле id_user таблицы users. Для того, чтобы указать это в SQL есть ключевое слово FOREIGN KEY (), которое имеет следующий синтаксис:
FOREIGN KEY (имя_столбца_которое_является_внешним_ключом) REFERENCES имя_таблицы_родителя (имя_столбца_родителя);
Укажем, что id_author – внешний ключ:
id_topic int (10) AUTO_INCREMENT
topic_name varchar(100) NOT NULL
id_author int (10) NOT NULL
PRIMARY KEY (id_topic)
FOREIGN KEY (id_author) REFERENCES users (id_user)
Таблица готова, и ее окончательный вариант выглядит так:
create table topics (id_topic int (10) AUTO_INCREMENT, topic_name varchar(100) NOT NULL, id_author int (10) NOT NULL, PRIMARY KEY (id_topic), FOREIGN KEY (id_author) REFERENCES users (id_user));
Осталась последняя таблица – posts (сообщения). Здесь все аналогично, только два внешних ключа:
create table posts (id_post int (10) AUTO_INCREMENT, message text NOT NULL, id_author int (10) NOT NULL, id_topic int (10) NOT NULL, PRIMARY KEY (id_post), FOREIGN KEY (id_author) REFERENCES users (id_user), FOREIGN KEY (id_topic) REFERENCES topics (id_topic));
Обратите внимание, что внешних ключей у таблицы может быть несколько, а первичный ключ в MySQL может быть только один.
Для создания БД «Форум» запускаем сервер MySQL (Пуск – Программы – MySQL – MySQL Server 5.1 – MySQL Command Line Client), вводим пароль, создаем БД forum (create database forum;), выбираем ее для использования (use forum;) и создаем три таблицы:
Обратите внимание, одну команду можно писать в несколько строк, используя клавишу Enter (MySQL автоматически подставляет символ новой строки ®), и только после разделителя (точки с запятой) нажатие клавиши Enter приводит к выполнению запроса. Помните, если вы сделали что-то не так, всегда можно удалить таблицу или всю БД с помощью оператора DROP. Исправлять что-то в командной строке крайне неудобно, поэтому иногда (особенно на начальном этапе) проще писать запросы в каком-нибудь редакторе, например в Блокноте, а затем копировать и вставлять их в черное окошко. Итак, таблицы созданы, чтобы убедиться в этом используем команду show tables:
Посмотрим структуру последней таблицы posts:
Поле DEFAULT – это поле значений по умолчанию: можно для какого-нибудь столбца (или для всех) указать значение по умолчанию. Например, если бы в таблице было поле с названием «Женаты\Замужем» и типом ENUM ('да', 'нет'), то было бы разумно сделать одно из значений значением по умолчанию. Синтаксис был бы следующий:
married enum ('да', 'нет') NOT NULL default('да').
Т.е. это ключевое слово пишется через пробел после указания типа данных, а в скобках указывается значение по умолчанию.
Теперь необходимо внести данные в таблицы. На сайтах обычно информация вводится в какие-нибудь html-формы, затем сценарий на каком-либо языке (php, java...) извлекает эти данные из формы и заносит их в БД. Делает он это посредством SQL-запроса на внесение данных в базу.
Для SQL-запроса на внесение данных используется оператор INSERT. Синтаксис можно использовать двух видов. Первый вариант используется для внесения данных во все поля таблицы:
INSERT INTO имя_таблицы VALUES ('значение_первого_столбца', 'значение_второго_столбца', ..., 'значение_последнего_столбца');
Внесем в таблицу users следующие значения:
INSERT INTO users VALUES ('1','sergey', 'sergey@mail.ru', '1111');
Второй вариант используется для внесения данных в некоторые поля таблицы:
INSERT INTO имя_таблицы ('имя_столбца', 'имя_столбца') VALUES ('значение_первого_столбца', 'значение_второго_столбца');
В таблице users все поля обязательны для заполнения, но первое поле имеет ключевое слово – AUTO_INCREMENT (т.е. оно заполняется автоматически), поэтому можно пропустить этот столбец: INSERT INTO users (name, email, password) VALUES ('valera', 'valera@mail.ru', '2222');
Если бы в таблице были поля с типом NULL, т.е. необязательные для заполнения, их тоже можно было проигнорировать. А вот если попытаться оставить пустым поле со значением NOT NULL, то сервер выдаст сообщение об ошибке и не выполнит запрос. Кроме того, при внесении данных сервер проверяет связи между таблицами. Поэтому не удастся внести в поле, являющееся внешним ключом, значение, отсутствующее в связанной таблице. В этом можно убедиться, внося данные в оставшиеся две таблицы. Но прежде внесем информацию еще о нескольких пользователях. Чтобы добавить сразу несколько строк, надо просто перечислять скобки со значениями через запятую:
Теперь внесем данные во вторую таблицу – topics (темы). Все тоже самое, но надо помнить, что значения в поле id_author должны присутствовать в таблице users (пользователи):
Теперь давайте попробуем внести еще одну тему, но с id_author, которого в таблице users нет (т.к. в таблицу users внесены только 5 пользователей, то id = 6 не существует):
Сервер выдает ошибку и говорит, что не может внести такую строку, т.к. в поле, являющемся внешним ключом, стоит значение, отсутствующее в связанной таблице users. Теперь внесем несколько строк в таблицу posts (сообщения), помня, что в ней 2 внешних ключа, т.е. id_author и id_topic, которые будут вноситься, должны присутствовать в связанных с ними таблицах:
Таким образом, были получены 3 таблицы, в которых есть данные.
Дата добавления: 2018-03-01; просмотров: 227;