Предыдущие части: Работаем с таблицами, Создаём базу данных, Установка MySQL
Несмотря на то, что в заголовках я пишу "Разрабатываем сайт", мы пока работаем только с базой данных. Всё потому, что база данных – практически главный компонент любого сайта, и пока мы не разберёмся с ней, никакой сайт мы разработать не сможем. Так что потерпите. В скором времени перейдём и к разработке самого сайта.
В предыдущей части мы научились создавать записи в таблице заметок note, но столкнулись с проблемой уникальной идентификации каждой записи. Напомню, что записи в таблице note состоят из трёх столбцов (полей):
- date – дата создания записи
- title – заголовок записи
- content – тело записи
Так как могут существовать две и более записей с одинаковыми датой, заголовком и телом, мы теряем возможность выбрать из таблицы одну конкретную запись. Мы просто не можем назвать какую-то уникальную характеристику этой записи.
Стало быть, нужно к этому набору данных добавить ещё одно поле, которое точно отличалось бы в каждой записи.
Хотя теоретически мы могли бы генерировать такое поле для каждой записи самостоятельно по какому-то алгоритму (самое простое: использовать не только дату, но и миллисекунды, или генерировать случайное число и т.д.), MySQL имеет встроенный механизм, который работает проще и надёжнее.
Поля с автоинкрементом
Если в таблице есть поле с автоинкрементом, оно ведёт себя так:
- Таблица "помнит", какое было последнее значение у этого поля
- При добавлении новой записи последнее значение поля увеличивается на 1
Значит, первая запись добавится со значением поля 1, вторая со значением 2, и т.д. Эти значения никогда не будут совпадать, и значит мы получим уникальное (в пределах таблицы) поле.
Как объявить поле с автоинкрементом при создании таблицы:
id int unsigned not null auto_increment primary key
Буквально это значит: "столбец с именем id, целочисленный без знака, автоинкрементный и первичный ключ"
Здесь очень много слов, поэтому разберём по частям.
- id – имя столбца. Оно может быть любое, но де-факто все называют его id, потому что это идентификатор записи.
- int unsigned – тип столбца. Так как его значение будет каждый раз увеличиваться на 1, то естественно, что это целочисленный тип без знака (отрицательные id нам не нужны).
- not null – это мы уже проходили. Сигнализирует, что столбец не может принимать пустые значения (что естественно, ведь он идентификатор).
- auto_increment – автоинкремент, значение при каждом добавлении записи увеличивается на 1.
- primary key – является первичным ключом таблицы. Тему ключей мы рассмотрим потом. Пока вкратце – ключ ускоряет поиск записей в таблице, и значения первичного ключа обязаны быть уникальными.
Как добавить это поле в таблицу note? У нас есть два способа.
Удаление таблицы
Можно удалить таблицу и создать её заново, добавив новое поле.
drop table note;
Буквально это значит: "удалить (дропнуть) таблицу note".
После этого мы можем повторить создание таблицы, указав автоинкрементное поле:
create table note(
id int unsigned not null auto_increment primary key,
date datetime,
title varchar(255) not null,
content text not null
);
Но этот вариант годится далеко не всегда. Ведь если в таблице уже есть записи, нам не хотелось бы их терять.
Модификация таблицы
Вместо пересоздания таблицы мы можем просто добавить в неё столбец:
alter table note add column id int unsigned not null auto_increment primary key first;
Буквально это значит: "изменить таблицу note добавить столбец id... первым".
Приписка first в конце команды означает, что нужно поставить столбец id первым по порядку. Без этой приписки столбец добавится последним. Его место значения не имеет, но аккуратнее, когда все таблицы сделаны по одному плану, и id это всегда первый столбец.
Если теперь сделать выборку из таблицы:
то можно видеть, что у записи, которая уже была в таблице, появилось поле id, и этому полю присвоено значение 1. Это произошло автоматически.
Добавим в таблицу ещё одну запись:
Для команды INSERT теперь нужно указать 4 значения полей: id, date, title, content. Но так как мы не задаём id сами, то вместо значения используем null ("ничего"). В результате мы получаем ещё одну запись, у которой автоматически присвоено id = 2.
Мы, однако, можем указать и конкретный id при создании, например, 4:
Как видим, после записей с id 1 и 2 создалась запись с id = 4. Что произошло с автоинкрементом, ведь после 2 должна идти 3? Ничего. Раз мы указали конкретное значение, то оно и было присвоено. Но теперь текущее значение автоинкрементного поля 4, и следующая запись получит автоматическое значение 5.
Теперь у нас есть две одинаковые записи, но у них отличается id. И значит, мы можем спокойно делать выборку нужной записи по id:
select * from note where id = 2;
Давайте удалим лишнюю запись с id = 4:
И добавим новую запись:
Обратите внимание: когда мы удалили лишнюю запись, в таблице остались две записи с id равными 1 и 2. То есть, по идее, следующая запись должна была добавиться с id = 3. Но она добавилась с id = 5. Дело в том, что даже после удаления записи с id = 4 таблица всё равно помнит, какое значение автоинкремента было последним, и продолжает считать от него. Поэтому любое значение id, использованное в таблице хотя бы раз, больше никогда не будет использовано в автоинкременте, даже если запись удалена.
Это делает автоинкрементные поля по-настоящему уникальными. Конкретный id принадлежит только одной записи и никогда не переиспользуется с другой записью. Каждая новая запись всегда имеет id больше, чем все, что когда-либо были до неё. (Исключение: когда мы сами задаём его руками при добавлении записи, но нам так делать не надо.)
Удаление столбца из таблицы
В процессе разработки таблицы часто модифицируются. В них добавляются новые столбцы, или удаляются старые. Чтобы удалить столбец, например, id, достаточно написать:
alter table note drop column id;
И у нас снова таблица без автоинкрементного столбца:
Кстати, что произойдёт, если мы добавим его заново? Повторим команду добавления, и вот что мы теперь видим:
Ранее из-за наших манипуляций записи имели id: 1, 2, 5, то есть в номерах был разрыв. После того как мы удалили столбец id и добавили его заново, каждая запись получила заново сгенерированный id, и теперь они идут по порядку: 1, 2, 3.
Да, вся уникальность теряется, если мы удалили столбец, который обеспечивает уникальность. При добавлении его обратно записи снова получают уникальные значения столбца, но эти значения могут не совпадать с предыдущими. Необходимо иметь это в виду.
Что ж, в принципе мы изучили всё, что необходимо для начала. И в следующем выпуске приступим к написанию кода на PHP для работы с базой.
Читайте дальше: PHP и база данных