Как составить таблицу mysql

Как Создавать Таблицы В My SQL (1)

Данные начинаются с создания таблиц. С реляционных таблиц, которые должны отвечать определённым правилам. В MySQL для создания таблиц используются специальные запросы, в которых указывается из каких атрибутов (полей) состоит таблица, какие типы данных в каждом поле, при необходимости делаются описания полей. В этой статье мы научим вас работать с таблицами в MySQL, разберем синтаксис CREATE TABLE, расскажем, как создавать таблицы и правильно вносить данные.

Для создания таблиц используется три основных способа.  

1. Если таблица создается с нуля, самыми первыми командами необходимо описать все поля. Для этого в MySQL используется инструкция CREATE TABLE со следующим синтаксисом: 

CREATE TEMPORARY  TABLE IF NOT EXISTS table_name

column_name_1 data_type_1,
column_name_2 data_type_2, 
...,
column_name_N data_type_N,
) ;

Обязательные параметры:

  • table_name — имя создаваемой таблицы (должно быть уникальным, и для удобства название должно описывать, что из себя представляет таблица);
  • column_name_1 — имя столбца;
  • data_type_1 — определяет тип данных, которые будут храниться в столбце.

Необязательные параметры: 

TEMPORARY — если это слово применяется в инструкции, то создается временная таблица, которая существует только в текущем сеансе и исчезает при переподключении к базе данных. Временные таблицы обычно используются для хранения промежуточных данных при сложных выборках. Доступ к временной таблице имеет только пользователь, который ее создал.

IF NOT EXISTS — команда для того, чтобы не выводилась ошибка, если таблица с таким именем уже существует. Проверка того, соответствует ли структура существующей таблицы той, которую мы пытались создать, не проводится, проверяет только имя.

2. Второй способ создания таблицы — на основе запроса: 

CREATE TEMPORARY  TABLE IF NOT EXISTS table_name

column_name_1 data_type_1,
column_name_2 data_type_2, 
...,
column_name_N data_type_N,

IGNORE | REPLACE
AS query_expression;

Обязательные параметры:

query_expressionзапрос SQL, на основе результатов которого создается таблица. Например, запрос может выглядеть следующим образом:

SELECT id, column_1 FROM table WHERE id > 15

Необязательный параметр: 

IGNORE | REPLACE — указывает, как поступать со строками, которые дублируют уникальные значения ключа.

Полная инструкция запроса может выглядеть так:

CREATE TABLE movies_copy 
(id INT, title CHAR(50) UNIQUE, year YEAR, summary TEXT) 
IGNORE 
SELECT id, title, year, storyline as summary FROM movies;

3. Третий способ — когда новая таблица создаётся на основе структуры другой таблицы. Можно сказать, что мы копируем другую таблицу:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
LIKE old_tbl_name;

old_tbl_name имя таблицы, которую мы хотим «клонировать». 

Этот метод создает таблицу с такой же структурой, как у исходной, но он не копирует данные, которые в ней хранятся. Мы получаем такую же таблицу, но пустую.

Типы данных в MySQL

В MySQL поддерживаются различные типы данных. Выбор правильного типа существенно влияет на производительность базы, особенно при больших размерах. Все типы данных можно разделить на несколько групп.

Числовые типы данных

Числовые типы делятся на целочисленные и вещественные. 

Для хранения целых чисел используются типы данных TINYINT, SMALLINT, MEDIUMINT, INT или BIGINT. Каждый из них позволяет хранить значения в диапазоне от -2(N-1)  до 2(N-1)-1, где N – это количество битов, которое требуется для хранения. При необходимости есть возможность, используя атрибут UNSIGNED, запретить отрицательные значения. В этом случае можно будет перенести диапазон значений так, чтобы он начинался от 0, например, от 0 до 255 для TINYINT. Самым распространенным типом данных является INT.  

Таблица байтов для целочисленных типов:

Тип

Объем, требующийся для хранения (байты)

Минимальное значение

(со знаком)

Минимальное значение

(без знака)

Максимальное значение

(со знаком)

Максимальное значение

(без знака)

TINYINT

1

-128

0

127

255

SMALLINT

2

-32768

0

32767

65535

MEDIUMINT

3

-8388608

0

8388607

16777215

INT

4

-2147483648

0

2147483647

4294967295

BIGINT

8

-263

0

263-1

264-1

Для вещественных чисел применяется 3 типа данных:

  • FLOAT (использует 4 байта) — хранит до 24 знаков после запятой;
  • DOUBLE (использует 8 байт) — хранит до 54 знаков после запятой;
  • DECIMAL (число байт зависит от выбранной точности).

Тип данных DECIMAL используется для хранения точных дробных чисел. Например, при хранении финансовых данных, когда нам нужны точные результаты при расчетах. Также можно использовать синонимы (псевдонимы) NUMERIC, DEC, FIXED. Для DECIMAL можно выбрать, какое количество значений мы хотим видеть до и после запятой. От этого и зависит, сколько он будет использовать байт. DECIMAL может принимать два параметра DECIMAL(precision, scale). В параметре precision указывается максимальное количество цифр, которые может хранить число. Это значение должно находиться в диапазоне от 1 до 65. В параметре scale указывается максимальное количество цифр, которые может содержать число после запятой. Это значение должно находиться в диапазоне от 0 до значения параметра precision. По умолчанию оно равно 0. Например, при параметрах DECIMAL(5,2) мы сможем хранить число 69839.12 или число 71468.2.

Символьные (строковые) типы данных 

  • CHAR имеет фиксированную длину до 255 символов. Полезен, когда необходимо сохранить короткие строки или, например, когда все данные примерно одинаковой длины. Так как длина фиксирована, то и объем выделяемого места тоже фиксирован. Если при создании таблицы указан CHAR(10) (10 — это длина строки, которую будем хранить), то все строки будут уметь длину 10. Если мы вводим меньшее количество символов, то оставшееся место заполнится пробелами. Получится, что место в базе данных выделено под пустоту.
  • VARCHAR хранит символьные строки динамической длины от 0 до 65535 символов, при условии, что версия MySQL выше чем 5.0.3. Удобен, когда мы не знаем, какой длины текст будем хранить. Использует ровно столько места, сколько необходимо под наши данные.
  • TEXT предназначен для хранения большого объема символьных данных. Существует 4 типа TEXT: TINYTEXT, TEXT, MEDIUMTEXT и LONGTEXT. Они отличаются максимальной длиной строки, которую могут содержать. Это особый тип (из-за размеров), поэтому часто он хранится отдельно, по-другому сортируется и не индексируется по полной длине. Похожие особенности имеет семейство BLOB. Эти типы данных могут хранить информацию больших объемов в двоичном виде. Семейство BLOB очень похоже на TEXT. К семейству BLOB относятся TINYBLOB, BLOB, MEDIUMBLOB и LONGBLOB.
  • ENUM хранит какой-то предопределенный набор строковых значений, который задается при создании столбца. Подходит, если в каком-то поле часто повторяются определенные значения, которых должно быть немного и список с которыми не приходится часто дополнять. Например, тип кузова автомобиля или планеты солнечной системы — их ограниченное количество, и появляются новые нечасто.  Все эти значения хранятся в виде целых чисел и занимают меньше места, чем строковые. Занимает 1-2 байта.
  • SET — это строковый объект, который может иметь 0 и более значений, каждое из которых выбрано из предопределённого списка, который задается при создании таблицы (максимальный размер — 64 элемента). Например, для хранения в столбце с типом SET жанра книги. SET хранит значения в виде целых чисел. Занимает 1-8 байт.

Типы данных для даты и времени

Для даты и времени существует несколько различных типов.

  • DATE хранит только дату в формате ‘YYYY-MM-DD’, занимает 3 байта. 
  • TIME хранит только время в формате ‘hh:mm:ss’, занимает 3 байта, диапазон значений от ‘-838:59:59.00’ до ‘838:59:59.00’. 
  • YEAR хранит год, диапазон значений 1901-2155, занимает 1 байт.

В случае, когда необходимо использовать и дату, и время понадобятся сразу 2 типа: DATETIME и TIMESTAP.

  • DATETIME — занимает 8 байт. Позволяет хранить диапазон значений с 1001 по 9999 год с точностью до 1 секунды в формате: ‘YYYY-MM-DD hh:mm:ss’. Не зависит от часового пояса.
  • TIMESTAP — использует 4 байта, поэтому диапазон дат у него гораздо меньше: от ‘1970-01-01 00:00:01’ до ‘2038-01-19 03:14:07’. Хранится в виде количества секунд, прошедших с начала эпохи Unix (1 января 1970 года по Гринвичу (GMT)). Отображаемое значение зависит от часового пояса. В более поздник версиях появилась поддержка хранения времени в микросекундах.

Ограничения в MySQL

Для обеспечения целостности базы данных в MySQL используются определенные ограничения (CONSTRAINT). Их можно разделить на два типа: ограничения уровня столбца и уровня таблицы (применяются либо к конкретному столбцу, либо ко всей таблице). Ограничения объявляются во время создания таблицы. К ним относят:

  • NOT NULL — указывает, что столбец не может содержать значение NULL.
  • UNIQUE — не позволяет вставлять повторяющиеся значения (все значения в столбце должны быть уникальны).
  • PRIMARY KEY — в столбце могут храниться только уникальные не NULL значения. Такой столбец может быть только один в таблице.
  • FOREIGN KEY — создает связь между двумя таблицами по конкретному столбцу. 
  • CHEK — контролирует значения в столбце, проверяет допустимо оно или нет.
  • DEFAULT — устанавливает значение по умолчанию для столбца. Если при внесении записи в таблицу это поле пропустили, то будет вставлено значение по умолчанию.

Типы индексов в MySQL 

Индекс — это структура, которая хранит в себе значение столбца таблицы (или нескольких) и ссылки на строки, где эти значения расположены. Создание индексов помогает увеличить эффективность работы MySQL, значительно повышая скорость запросов. Большая часть индексов имеет древовидную структуру данных (является B-tree индексом). Индекс занимает место в памяти, поэтому индексируются обычно только те поля, по которым происходит выборка данных. Когда индекса нет, при запросе поиск идет по всем записям таблицы, что может отнимать много времени и вычислительных мощностей. 

В MySQL индексы ускоряют операции:

  • Поиск строк, соответствующих запросу WHERE
  • Извлечение строк при выполнении объединений; 
  • Для поиска минимальных MIN() и максимальных MAX() значений определенного индексированного столбца;
  • Сортировки или группировки таблиц при условии, что операция выполняется по крайнему левому префиксу используемого индекса.

В MySQL могут быть следующие типы индексов

  • Primary key (первичный ключ) Это столбец, который идентифицирует каждую строку в таблице однозначно. Обычно указывается при создании таблицы. Если этого не сделать самостоятельно, MySQL всё равно создаст скрытый ключ. Primary key содержит уникальные значения. Если он состоит из нескольких столбцов, то комбинация значений в них должна быть уникальной. В Primary key не может быть значений NULL. Таблица может иметь только один первичный ключ.
  • Уникальный индекс. Обеспечивает уникальность значений в одном или нескольких столбцах. В отличии от первичного ключа можно сделать много уникальных индексов. Может иметь значение NULL.
  • Составной индекс. Это индекс по нескольким столбцам. MySQL позволяет создавать составные индексы, содержащие до 16 столбцов. Обычно используется для ускорения запросов, в которых необходимо произвести выборку по нескольким полям.

Не рекомендуется использовать индексы для небольших таблиц. Улучшения от использования индексов не будет заметно. Создавать индексы следует в первую очередь для медленных запросов или для самых часто используемых. Для этого следует собрать статистику выполнения запросов и провести оценку. Создавать индексы для всего подряд не лучшая идея.

Итак, узнав основы теории создания таблиц в MySQL, перейдём к примерам.

Пример 1

Создадим с нуля таблицу с подборкой фильмов.

CREATE TABLE movies (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title CHAR(100) NOT NULL,
year YEAR NOT NULL,
running_time_min INT NOT NULL,
storyline TEXT
);

В таблице создаются следующие столбцы:

  • id — уникальный идентификатор фильма
  • title — название фильма
  • year — год выхода
  • running_time_min — длительность фильма в минутах
  • storyline — сюжетная линия, небольшое описание фильма

Все поля имеют ограничение NOT NULL. Первичный ключ PRIMARY KEY – поле id. 

Пока в таблице имеются только столбцы для которых заданы типы данных. Теперь внесём в таблицу сами данные. Для этого используются команды INSERT и VALUES

INSERT movies3(title, year, running_time_min, storyline) 
VALUES ('Harry Potter and the Philosophers Stone', 2001, 152, "An orphaned boy enrolls in a school of wizardry, where he learns the truth about himself, his family and the terrible evil that haunts the magical world."),
('Harry Potter and the Chamber of Secrets', 2002, 162,"An ancient prophecy seems to be coming true when a mysterious presence begins stalking the corridors of a school of magic and leaving its victims paralyzed."),
('The Green Mile', 1999, 188,'Death Row guards at a penitentiary, in the 1930s, have a moral dilemma with their job when they discover one of their prisoners, a convicted murderer, has a special gift.'),
('Forrest Gump', 1994, 142,"The presidencies of Kennedy and Johnson, the Vietnam War, the Watergate scandal and other historical events unfold from the perspective of an Alabama man with an IQ of 75, whose only desire is to be reunited with his childhood sweetheart."),
('Cast Away', 2000, 143,"A FedEx executive undergoes a physical and emotional transformation after crash landing on a deserted island.");

Получаем такую таблицу: 

Image1

Пример 2

Теперь создадим таблицу на основе запроса. Возьмём все фильмы, которые вышли после 1999 года:

CREATE TABLE movies_query 
AS
SELECT id, title, year, running_time_min 
FROM movies 
WHERE year > 1999;

Результат запроса:

Image3

Пример 3

Создадим таблицу на основе структуры другой таблицы: 

CREATE TABLE movies_copy 
LIKE movies;

Таблица получится пустая. Структура такая же, как у таблицы movies, но данных в новой таблице нет. Результат:

Image2

Foreign keys (внешние ключи)

Когда в базе данных есть несколько таблиц, в какой-то момент нам понадобится их связать между собой. Для этого в MySQL используются внешние ключи

Внешний ключ в MySQL — это столбец (или группа), которые используются для связи данных между таблицами. Внешний ключ ссылается на первичный ключ в другой таблице. Внешний ключ является ограничением. Исходная таблица с первичным ключом называется родительской, а та, что хранит внешний ключ — дочерней.

Создание ключа:

CONSTRAINT symbol FOREIGN KEY
index_name (col_name, ...)
REFERENCES tbl_name (col_name,...)
ON DELETE reference_option
ON UPDATE reference_option

Обязательные параметры:

  • FOREIGN KEY [index_name] (col_name, ...) — указывается, какое поле будет внешним ключом.
  • index_name имя индекса.
  • col_name имя столбца.
  • REFERENCES tbl_name (col_name,...) — указание столбца родительской таблицы, с которым будет связан наш внешний ключ.
  • tbl_name имя таблицы.
  • col_name имя столбца.

Необязательные параметры:

CONSTRAINT symbol используется для создания и удаления ограничений.

ON DELETE/ ON UPDATE — определяет, что делать при удалении или обновлении родительской таблицы. Здесь есть несколько опций:

  • CASCADE — при удалении или обновлении записи в родительской таблице, в дочерней они автоматически тоже удаляются или обновляются.
  • SET NULL — если в родительской таблице данные удаляются или обновляются, то в дочерней эти значения заменяются на NULL.
  • RESTRICT — запрет удаления или обновления данных, если они использованы в дочерней таблице.
  • NO ACTION — пришло из стандарта SQL. Работает аналогично RESTRICT.

Пример 4

Создадим таблицу с жанрами фильмов:

CREATE TABLE genres (
id INT AUTO_INCREMENT PRIMARY KEY,
genre VARCHAR(200) UNIQUE NOT NULL
);

Оба столбца не должны содержать значения NULL, для столбца genre указано дополнительно ограничение UNIQUE, все значения должны быть уникальны.

Заполним ее:

INSERT genres(genre) 
VALUES ('drama'),
 ('fantasy'),
 ('sci-fi'),
 ('cartoon');

Получим результат с id для каждого жанра.

А вот пример создания в MySQL новой таблицы с использованием FOREIGN KEY: 

CREATE TABLE movies2 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title CHAR(100) NOT NULL,
year YEAR NOT NULL,
running_time_min INT NOT NULL,
genre_id INT,
FOREIGN KEY (genre_id) REFERENCES genres (id)
);

Получаем такую табличку:

Image4

Чтоб получилось совсем красиво, можно с помощью LEFT JOIN и таблицы genres вывести не цифры, а сами жанры.

SELECT movies2.id, title, year, genre from movies2 
LEFT JOIN genres on genres.id = genre_id;

Image6

Манипуляции с таблицами

Для работы с уже созданной таблицей существуют различные команды. Мы опишем основные команды для MySQL, позволяющие делать переименования, вносить изменения, удалять и добавлять столбцы, менять типы данных. 

Переименование делается с помощью команды RENAME TABLE. Возможны разные особенности применения.

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

USE movies_db;
RENAME TABLE movies2 TO cinema;

Вариант 2. Применяется в случае, если не указали базу данных:

RENAME TABLE movies_db.movies2 TO movies_db.cinema;

Также с помощью команды RENAME TABLE можно перенести таблицу из одной базы в другую:

RENAME TABLE movies_db.movies2 TO cinema_db.cinema;

Для добавления нового столбца нам понадобится команда ADD.

ALTER TABLE cinema
ADD Language VARCHAR(50) NULL;

Чтобы удалить столбец в MySQL используется ALTER TABLE с DROP COLUMN:

ALTER TABLE cinema
DROP COLUMN Language;

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

  • CHANGE — позволяет переименовать столбец и изменить его определение, или сделать и то, и другое.

     Изменим тип столбца year на INT и имя столбца на date:

ALTER TABLE cinema CHANGE year date INT NOT NULL;

Если мы не хотим менять имя столбца, тогда необходимо дважды указать старое имя:

ALTER TABLE cinema CHANGE year year INT NOT NULL;
  • MODIFY — даёт возможность изменить определение столбца, но не его имя.

     Изменим тип столбца title на VARCHAR(100):

ALTER TABLE cinema
MODIFY COLUMN title VARCHAR(100;
  • RENAME COLUMNизменяет имя столбца.
ALTER TABLE cinema RENAME COLUMN running_time_min TO running_time;

Операции с удалением 

Если надо очистить таблицу от данных используется команда TRUNCATE TABLE:  

TRUNCATE TABLE cinema;

С помощью DROP TABLE можно полностью удалить таблицу из базы данных:

DROP TABLE cinema;

Для добавления и удаления внешнего ключа воспользуемся уже знакомой нам командой ADD:

ALTER TABLE cinema
ADD FOREIGN KEY(producer_id) REFERENCES producer(Id);

Приведённые операторы и примеры охватывают базовую работу с таблицами, но изучив эти основные команды MySQL, вы уже сможете делать много полезных вещей. Применять эти навыки можно, в том числе, для работы с базами MySQL, развернутыми в облаке cloud.timeweb.com.

Как создавать таблицы в MySQL (Create Table)

О типах данных, атрибутах, ограничениях и об изменениях в уже созданной таблице.

Введение

В данной статье мы рассмотрим, как правильно создавать таблицы в MySQL. Для этого разберем основные типы данных, атрибуты, ограничения, и что можно исправить в уже созданной таблице. Чтобы сократить последующие изменения, стоит заранее продумать структуру таблицы и ее содержимое. Наиболее важные пункты:

  • Названия таблиц и столбцов.
  • Типы данных столбцов.
  • Атрибуты и ограничения.

Ниже разберем подробнее, как реализовать этот короткий список для MySQL наиболее эффективно.

Синтаксис Create table в MySQL и создание таблиц

Поскольку наш путь в базы данных только начинается, стоит вспомнить основы. Реляционные базы данных хранят данные в таблицах, и каждая таблица содержит набор столбцов. У столбца есть название и тип данных. Команда создания таблицы должна содержать все вышеупомянутое:

    CREATE TABLE table_name 
(
    column_name_1 column_type_1,
    column_name_2 column_type_2,
    ...,
    column_name_N column_type_N,
);

table_name — имя таблицы;

column_name — имя столбца;

column_type — тип данных столбца.

Теперь разберем процесс создания таблицы детально.

Названия таблиц и столбцов

Таблицы и столбцы стоит называть осмысленно и прозрачно, чтобы было понятно, как другому разработчику, так и вам самим спустя полгода. Даже если это учебная база только для вашего пользования, рекомендуем сразу привыкать делать правильно.

Имена могут содержать символы подчеркивания для большей наглядности. Классический пример непонятных названий — table1, table2 и т. п. Использование транслита, неясных сокращений и, разумеется, наличие орфографических ошибок тоже не приветствуется. Хороший пример коротких информативных названий: Customers, Users, Orders, так как по названию таблицы должно быть очевидно, какие данные таблица будет содержать. Эта же логика применима и к названию столбцов.

Максимальная длина названия и для таблицы, и для столбцов — 64 символа.

Типы данных столбцов

Для каждого столбца таблицы будет определен тип данных. Неправильное использование типов данных увеличивает как объем занимаемой памяти, так и время выполнения запросов к таблице. Это может быть незаметно на таблицах в несколько строк, но очень существенно, если количество строк будет измеряться десятками и сотнями тысяч, и это далеко не предел для рабочей базы данных. Проведем краткий обзор наиболее часто используемых типов:

Числовые типы

  • INT — целочисленные значения от −2147483648 до 2147483647, 4 байта.
  • DECIMAL — хранит числа с заданной точностью. Использует два параметра — максимальное количество цифр всего числа (precision) и количество цифр дробной части (scale). Рекомендуемый тип данных для работы с валютами и координатами. Можно использовать синонимы NUMERIC, DEC, FIXED.
  • TINYINT — целые числа от −127 до 128, занимает 1 байт хранимой памяти.
  • BOOL — 0 или 1. Однозначный ответ на однозначный вопрос — false или true. Название столбцов типа boolean часто начинается с is, has, can, allow. По факту это даже не отдельный тип данных, а псевдоним для типа TINYINT (1). Тип настолько востребован на практике, что для него в MySQL создали встроенные константы FALSE (0) или TRUE (1). Можно использовать синоним BOOLEAN.
  • FLOAT — дробные числа с плавающей запятой (точкой).

Символьные

  • VARCHAR(N) — N определяет максимально возможную длину строки. Создан для хранения текстовых данных переменной длины, поэтому память хранения зависит от длины строки. Наиболее часто используемый тип строковых данных.
  • CHAR(N) — как и с varchar, N указывает максимальную длину строки. Char создан хранить данные строго фиксированной длины, и каждая запись будет занимать ровно столько памяти, сколько требуется для хранения строки длиной N.
  • TEXT — подходит для хранения большого объема текста до 65 KB, например, целой статьи.

Дата и время

  • DATE — только дата. Диапазон от 1000-01-01 по 9999-12-31. Подходит для хранения дат рождения, исторических дат, начиная с 11 века. Память хранения — 3 байта.
  • TIME — только время — часы, минуты, секунды — «hh:mm:ss». Память хранения — 3 байта.
  • DATETIME — соединяет оба предыдущих типа — дату и время. Использует 8 байтов памяти.
  • TIMESTAMP — хранит дату и время начиная с 1970 года. Подходит для большинства бизнес-задач. Потребляет 4 байта памяти, что в два раза меньше, чем DATETIME, поскольку использует более скромный диапазон дат.

Бинарные

Используются для хранения файлов, фото, документов, аудио и видеоконтента. Все это хранится в бинарном виде.

  • BLOB — до 65 КБ бинарных данных
  • LARGEBLOB — до 4 ГБ.

Подробный разбор типов данных, включая более специализированные типы, например, ENUM, SET или BIGINT UNSIGNED, будет в отдельной тематической статье.

Практика с примерами

Для лучшего понимания приведем пример, создав простую таблицу для хранения данных сотрудников, где

  • id — уникальный номер,
  • name — ФИО,
  • position — должность
  • birthday — дата рождения

Синтаксис create table с основными параметрами:

    CREATE TABLE Staff 
(
    id INT,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday Date
);

Тут могут появиться вопросы. Откуда MySQL знает, что номер уникален? Если еще нет должности для этого сотрудника, что будет, если оставить поле пустым?
Все это (как и многое другое) придtтся указать с помощью дополнительных параметров — атрибутов.

Часто таблицы создаются и заполняются скриптами. Если мы вызовем команду CREATE TABLE Staff, а таблица Staff уже есть в базе, команда выдаст ошибку. Поэтому перед созданием разумно проверить, содержит ли уже база таблицу Staff. Достаточно добавить IF NOT EXISTS, чтобы выполнить эту проверку в MySQL, то есть вместо

    CREATE TABLE Staff

напишем

    CREATE TABLE IF NOT EXISTS Staff

Повторный запуск команды выведет предупреждение:

    1050 Table 'Staff' already exists

Если таблица уже создана и нужно создать таблицу с тем же именем с «чистого листа», старую таблицу можно удалить командой:

    DROP TABLE table_name;

Атрибуты (ATTRIBUTES) и ограничения (CONSTRAINTS)

PRIMARY KEY

Предназначение индексов — обеспечить быстрый доступ к табличным данным. Основная идея — существенное ускорение поиска. Создание первичного ключа, внешних ключей, определение уникальных значений в столбце — во всех этих случаях будут созданы индексы. Существуют определенные ограничения на построения индексов в зависимости от типов данных, но разбор этих нюансов будет в других статьях.

Пользы индексов на примерах: для поиска уникального значения среди 10000 строк придется проверить, в худшем случае, все 10000 без индекса, с индексом — всего 14. Поиск по миллиону записей займет не больше в 20 проверок — это реализация идеи бинарного поиска.

Создадим таблицу Staff с номером сотрудника в качестве первичного ключа. Первичный ключ гарантирует нам, что номер точно будет уникальным, а поиск по нему — быстрым.

    CREATE TABLE Staff (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    position VARCHAR(30),
    birthday Date,
    has_children BOOLEAN
);

NOT NULL

При заполнении таблицы мы утверждаем, что значение этого столбца должно быть установлено. Если нет явного указания NOT NULL, и этот столбец не PRIMARY KEY, то столбец позволяет хранить NULL, то есть хранение NULL — поведение по умолчанию. Для первичного ключа это ограничение можно не указывать, так как первичный ключ всегда гарантирует NOT NULL.

Изменим команду CREATE TABLE, добавив NOT NULL ограничения: таким образом, мы обозначим обязательные для заполнения столбцы (т.е. столбцы, поля в которых не могут оставаться пустыми при наличии записи в таблице):

    CREATE TABLE Staff (
    id INT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday DATE NOT NULL,
    has_children BOOLEAN NOT NULL
);

DEFAULT

Можно указать значение по умолчанию, т.е. текст или число, которые будут сохранены, если не указано другое значение. Применяется не ко всем типам: BLOB, TEXT, GEOMETRY и JSON не поддерживают это ограничение.
Эта величина должна быть константой, функция или выражение не допустимы.

Продолжим изменять команду, установив ограничение DEFAULT для поля BOOLEAN.

    CREATE TABLE Staff (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday DATE NOT NULL,
    has_children BOOLEAN DEFAULT(FALSE) NOT NULL
);

Для типа данных BOOLEAN можно использовать встроенные константы FALSE и TRUE. Вместо DEFAULT(FALSE) можно указать DEFAULT(0) — эти записи эквивалентны.

AUTO_INCREMENT

Каждый раз, когда в таблицу будет добавлена запись, значение этого столбца автоматически увеличится. На всю таблицу этот атрибут применим только к одному столбцу, причем этот столбец должен быть ключом. Рекомендуется использовать для целочисленных значений. Нельзя сочетать с DEFAULT.

    CREATE TABLE Staff (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday DATE NOT NULL,
    has_children BOOLEAN DEFAULT(FALSE) NOT NULL
);

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

Интересно, что при CREATE TABLE MySQL не позволяет установить стартовое значение для AUTO_INCREMENT. Можно назначить стартовое значение для счетчика AUTO_INCREMENT уже созданной таблицы. 

Синтаксис:

    ALTER TABLE Staff AUTO_INCREMENT=10001;

Первая запись после такой модификации получит id = 10001.

UNIQUE

Это ограничение устанавливает, что все значения данного столбца будут уникальны в пределах таблицы, и создает индекс. Можно применять к столбцам с поддержкой NULL, но так как NULL будет считаться уникальным значением, возможна только одна NULL-запись.

    CREATE TABLE Staff (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday DATE NOT NULL,
    has_child BOOLEAN DEFAULT(0) NOT NULL,
    phone VARCHAR(20) UNIQUE NOT NULL
);

CHECK

Позволяет установить дополнительную проверку данных для столбца или набора столбцов. Это тоже CONSTRAINT, так как накладывает ограничение.
На примере ограничим дату рождения сотрудника.

Синтаксис позволяет устанавливать CHECK как в описании столбца при CREATE TABLE:

    birthday DATE NOT NULL CHECK (birthday > ‘1900-01-01’),

так отдельно от описания столбцов:

    CHECK (birthday > ‘1900-01-01’),

В этих случаях название проверки будет определено автоматически. При вставке данных, не прошедших проверку, будет сообщение об ошибке Check constraint ‘staff_chk_1’ is violated. Ситуация усложняется, когда установлено несколько CHECK, поэтому рекомендуется давать понятное имя.

Воспользуемся полной командой для создания CHECK и определим не только ограничение даты рождения, но и допустимые форматы телефона через регулярное выражение.

    CREATE TABLE Staff (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday DATE NOT NULL,
    has_child BOOLEAN DEFAULT(0) NOT NULL,
    phone VARCHAR(20) UNIQUE NOT NULL,
    CONSTRAINT staff_chk_birthday CHECK (birthday > '1900-01-01'),
    CONSTRAINT staff_chk_phone CHECK (phone REGEXP '[+]?[0-9]{1,3} ?\(?[0-9]{3}\)? ?[0-9]{2}[0-9 -]+[0-9]{2}')
);

Для добавления ограничений используем оператор CONSTRAINT, при этом, все названия уникальны, как и имена таблиц. Учитывая, что по умолчанию названия включают в себя и имя таблицы, рекомендуем придерживаться этого правила. Если используется CONSTRAINT, мы обязаны дать имя ограничению, которое вводим.

FOREIGN KEY или внешний ключ

Внешний ключ — это ссылка на столбец или группу столбцов другой таблицы. Это тоже ограничение (CONSTRAINT), так как мы сможем использовать только значения, для которых есть соответствие по внешнему ключу. Создает индекс. Таблицу с внешним ключом называют зависимой.

Синтаксис:

    FOREIGN KEY (column_name1, column_name2) 
REFERENCES external_table_name(external_column_name1, external_column_name2)

Сначала указывается выражение FOREIGN KEY и набор столбцов таблицы, откуда строим FOREIGN KEY. Затем ключевое слово REFERENCES указывает на имя внешней таблицы и набор столбцов этой внешней таблицы. В конце можно добавить операторы ON DELETE и ON UPDATE, с помощью которых настраивается поведение при удалении или обновлении данных в главной таблице. Это делать не обязательно, так как предусмотрено поведение по умолчанию. Поведение по умолчанию запрещает удалять или изменять записи из внешней таблицы, если на эти записи есть ссылки по внешнему ключу.

Возможные опции для ON DELETE и ON UPDATE:

CASCADE: автоматическое удаление/изменение строк зависимой таблицы при удалении/изменении связанных строк главной таблицы.
SET NULL: при удалении/изменении связанных строк главной таблицы будет установлено значение NULL в строках зависимой таблицы. Столбец зависимой таблицы должен поддерживать установку NULL, т.е. параметр NOT NULL в этом случае устанавливать нельзя.
RESTRICT: не даёт удалить/изменить строку главной таблицы при наличии связанных строк в зависимой таблице. Если не указана иная опция, по умолчанию будет использовано NO ACTION, что, по сути, то же самое, что и RESTRICT.

Рассмотрим пример:
Для таблицы Staff было определено текстовое поле position для хранения должности.
Так как список сотрудников в компании обычно больше, чем список занимаемых должностей, есть смысл создать справочник должностей.

    CREATE TABLE Positions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL
);

Поскольку из Staff мы будем ссылаться на Positions, таблица персонала Staff будет зависимой от Positions. Изменим синтаксис CREATE TABLE для таблицы Staff, чтобы должность была ссылкой на запись в таблице Positions.

    CREATE TABLE Staff (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position_id int,
    birthday DATE NOT NULL,
    has_child BOOLEAN DEFAULT(0) NOT NULL,
    phone VARCHAR(20) UNIQUE NOT NULL,
    FOREIGN KEY (position_id) REFERENCES Positions (id)
);

При CREATE TABLE, чтобы не усложнять описание столбца, рекомендуется указывать внешний ключ и все его атрибуты после перечисления создаваемых столбцов.
Можно ли добавить внешний ключ, если таблица уже создана и в ней есть данные? Можно! Для внесения изменений в таблицу используем ALTER TABLE.

Синтаксис:

    ALTER TABLE Staff
ADD FOREIGN KEY (position_id) REFERENCES Positions(id);

Или в развернутой форме, определяя имя ключа fk_position_id явным образом:

    ALTER TABLE Staff
ADD CONSTRAINT fk_position_id FOREIGN KEY (position_id) REFERENCES Positions(id);

Главное условие в этом случае — согласованность данных. Это значит, что для всех записей внешнего ключа position_id должно найтись соответствие в целевой таблице Positions по столбцу id.

Создание таблиц на основе уже существующих, временные таблицы

Мы рассмотрели создание таблицы с «чистого листа», но есть два других способа:

  • LIKE
  • SELECT

LIKE

Создание таблицы на основе уже существующей таблицы. Копирует структуру — количество, названия и типы столбцов, индексы, все ограничения, кроме внешних ключей. Как мы помним, внешний ключ создает индекс. При создании через LIKE индексы в новой таблице будут построены также, как и в старой, но внешние ключи не скопируются. Таблица будет создана без записей и без счетчиков AUTO_INCREMENT.

Синтаксис: 

    CREATE TABLE new_table LIKE source_table;

SELECT

Можно создать таблицу на основе SELECT-запроса — результат этой выборки будет записан в новую таблицу. Такая таблица не будет иметь индексов, ограничений и ключей. Все столбцы, с учетом порядка, типов данных и названий, будут взяты из запроса — поля из SELECT станут столбцами новой таблицы. При этом можно переопределить изначальные названия полей, что особенно актуально, когда в выборку попадают столбцы с одинаковыми названиями (на уровне таблицы названия столбцов всегда уникальны).

Синтаксис:

    CREATE TABLE new_table [AS] SELECT * FROM source_table;

Разберем пример создания новой таблицы через SELECT, используя две таблицы в выборке — Staff и Positions. В запросе определим три поля: id, staff, position — это будут столбцы новой таблицы StaffData211015 (срез сотрудников на определённую дату). Без присвоения псевдонимов (name as staff, name as position) в выборке получилось бы два одинаковых поля name, что не позволило бы создать таблицу из-за duplicate column name ошибки.

    CREATE TABLE StaffData211015
SELECT s.Id,
       s.name as staff,
       p.name as position
FROM Staff s
JOIN Positions p ON s.position_id = p.id

TEMPORARY

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

Чтобы обозначить таблицу как временную, нужно добавить TEMPORARY в CREATE TABLE:

    CREATE TEMPORARY TABLE table_name;

Работа с уже созданной таблицей

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

Переименование

Ключевая команда — RENAME.

  • Изменить имя таблицы:
    RENAME TABLE old_table_name TO new_table_name;
  • Изменить название столбца:
    ALTER TABLE table_name
RENAME COLUMN old_column_name TO new_column_name;

Удаление данных

  • DELETE FROM Staff; — удалит все записи из таблицы. Условие в WHERE позволит удалить только определенные строки, в примере ниже удалим только одну строку с id = 1. DELETE FROM Staff WHERE id = 1;
  • TRUNCATE TABLE Staff; — используется для полной очистки всей таблицы. При TRUNCATE счетчики AUTO_INCREMENT сбросятся. Если бы мы удалили все в строки командой DELETE, то новые строки учитывали бы накопленный за время жизни таблицы AUTO_INCREMENT.
  • DROP TABLE Staff; — команда удаления таблицы.

Изменение структуры таблицы

Команда ALTER TABLE включает в себя множество опций, рассмотрим основные вместе с примерами на таблице Staff.

Добавление столбцов

Добавим три столбца: электронную почту, возраст и наличие автомобиля. Так как в таблице уже есть записи, мы не можем пока что отметить эти поля как NOT NULL, по умолчанию они будут позволять хранить NULL.

    ALTER TABLE Staff
ADD email VARCHAR(50),
ADD age INT,
ADD has_auto BOOLEAN;

Удаление столбцов

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

    ALTER TABLE Staff
DROP COLUMN age;

Значение по умолчанию

Выставим значение по умолчанию для столбца has_auto:

    ALTER TABLE Staff
ALTER COLUMN has_auto SET DEFAULT(FALSE);

Изменение типа данных столбца

Для столбца name изменим тип данных:

    ALTER TABLE Staff
MODIFY COLUMN name VARCHAR(500) NOT NULL;

Максимальная длина поля была увеличена. Если не указать NOT NULL явно, то поле станет NULL по умолчанию.

Установка CHECK

Добавим ограничение формата для email через регулярное выражение:

    ALTER TABLE Staff
ADD CONSTRAINT staff_chk_email CHECK (email REGEXP '^[^@]+@[^@]+\.[^@]{2,}$');
 

Заключение

Любой путь начинается с первых шагов. В работе с базами данных этими шагами является создание структуры таблиц. Продуманная композиция сущностей (таблиц) и связей между ними — основа проектирования любого вашего приложения от интернет-магазинов до мощных систем управления предприятиями.

И уже через пару минут сможете арендовать сервер, развернуть базы данных или обеспечить быструю доставку контента.


Загрузить PDF


Загрузить PDF

Таблицы составляют основу структуры базы данных MySQL. Таблицы содержат введенную в базу данных информацию и могут быть созданы для любых целей хранения данных. Создание таблицы занимает всего несколько минут, особенно если у вас лишь несколько записей для сохранения. В этой статье мы и расскажем, как это сделать.

  1. Изображение с названием 1282937 1

    1

    Откройте базу данных. Для создания таблицы вам необходимо иметь базу данных, которая будет ее содержать. Вы можете открыть базу данных, набрав USE database в командной строке MySQL.

    • Если вы не помните имя базы данных, наберите SHOW DATABASES;, чтобы вывести список баз данных на сервере MySQL.
    • Если у вас пока нет базы данных, вы можете ее создать, набрав CREATE DATABASE database;. Имя базы данных не может содержать пробелы.
  2. Изображение с названием 1282937 2

    2

    Изучите основные типы данных. Каждая запись в таблице сохраняется как определенный тип данных. Это позволяет MySQL взаимодействовать с ними различными способами. Типы данных, которые вы будете использовать, зависят от назначения вашей таблицы. Есть много типов кроме нижеперечисленных, но вы можете их использовать для создания базовой, пригодной для использования таблицы:

    • INT — этот тип данных для целых чисел, и он часто используется для поля идентификатора (ID).
    • DECIMAL — этот тип хранит десятичные значения и определяется как общее количество цифр и количество цифр после запятой. Например: DECIMAL(6,2) будет содержать числа вида «0000.00».
    • CHAR—- это основной тип данных для текста и строк. При этом обычно нужно указать только максимальное количество содержащихся символов, например CHAR(30). Вы также можете использовать VARCHAR, чтобы менять размер в зависимости от введенных данных. Телефонные номера должны сохраняться с использованием этого типа данных, так как они зачастую содержат символы и никак не взаимодействуют с числами (их не складывают, не вычитают и так далее).[1]
    • DATE — этот тип данных хранит даты в формате ГГГГ-ММ-ДД. Используйте этот, если хотите хранить чей-то возраст, а не просто фактический возраст, в противном случае вам придется каждый год обновлять эту запись.
  3. Изображение с названием 1282937 3

    3

    Создайте таблицу. Чтобы создать таблицу из командной строки, вам нужно создать все поля с помощью одной команды. Вы создаете таблицы, используя команду CREATE TABLE с последующей информацией о таблице. Чтобы создать базовую запись о сотруднике, вам нужно ввести следующую команду:

    CREATE TABLE employees (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, lastname VARCHAR(20), firstname VARCHAR(20), phone VARCHAR(20),  dateofbirth DATE)
    
    • INT NOT NULL PRIMARY KEY AUTO_INCREMENT создает числовой идентификатор для каждого работника, который добавляется в запись. Это число каждый раз автоматически увеличивается. Это позволяет легко ссылаться на сотрудников с помощью других функций.
    • Хотя VARCHAR позволяет уменьшать размер в зависимости от введенных данных, вы можете установить максимум для него, чтобы пользователь не мог ввести слишком длинные строки. В приведенном выше примере имя и фамилия ограничены 20-ю символами.
    • Заметьте, что запись о телефонном номере хранится как VARCHAR, поэтому символы тоже обрабатываются корректно.
  4. Изображение с названием 1282937 4

    4

    Проверьте, что ваша таблица была создана правильно. Как только вы создадите таблицу, вы получите сообщение, что она была успешно создана. Теперь вы можете использовать команду DESCRIBE, чтобы убедиться, что вы включили все поля, что хотели, и что у них правильные типы данных. Введите DESCRIBE database; и посмотрите на появившийся график, чтобы проверить структуру вашей таблицы.

  5. Изображение с названием 1282937 5

    5

    Создайте таблицу с использованием PHP. Если вы используете PHP для администрирования вашей базы данных MySQL через веб-сервер, вы можете создать таблицу, используя простой PHP-файл. Предполагается, что база данных уже существует на сервере MySQL. Для создания такой же таблицы, как и в Шаге 3, введите следующий код, заменив информацию о соединении на актуальную для вас:

    <?php
    $connection=mysqli_connect({{samp|server}},{{samp|user}},{{samp|password}}, {{samp|database}});
    if (mysqli_connect_errno())
    {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
    $sql = "CREATE TABLE employees 
    (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    lastname VARCHAR(20),
    firstname VARCHAR(20),
    phone VARCHAR(20),
    dateofbirth DATE
    )";
    
    if (mysqli_query($connection,$sql))
    {
    echo "Table employees created successfully";
    }
    else
    {
    echo "Error creating table: " . mysqli_error($connection);
    }
    ?>
    

    Реклама

  1. Изображение с названием 1282937 6

    1

    Добавьте одну запись в таблицу. Вы можете вводить данные в таблицу напрямую из командной строки. Вы можете использовать одну команду для ввода всех относящихся к записи полей, используя INSERT INTO:

    INSERT INTO employees (id, lastname, firstname, phone, dateofbirth) VALUES (NULL, 'Smith', 'John', '(555)555-5555', '1980-01-31');
    
    • Если вы вводите значение NULL для поля ID, это значение будет увеличиваться на 1 в каждой последующей записи по сравнению с последней.
    • Убедитесь, что каждое вводимое вами значение заключено в одинарные кавычки (‘).
  2. Изображение с названием 1282937 7

    2

    Добавьте сразу несколько записей. Если перед вами есть все данные, вы можете вставить сразу несколько записей одной командой INSERT INTO. Просто разделите наборы данных запятой:

    INSERT INTO employees (id, lastname, firstname, phone, dateofbirth) VALUES (NULL, 'Smith', 'John', '(555)555-5555', '1980-01-31'), (NULL, 'Doe', 'Jane', '(555)555-5551', '1981-02-28'), (NULL, 'Baker', 'Pat', '(555)555-5554', '1970-01-31');
    
  3. Изображение с названием 1282937 8

    3

    Отобразите вашу таблицу. Как только вы добавили несколько записей, вы можете отобразить вашу таблицу, чтобы посмотреть, как все это выглядит. Это позволит вам увидеть, не пропустили ли вы какую-либо информацию и все ли в правильном месте. Чтобы отобразить созданную выше таблицу, наберите SELECT * FROM employees.

    • Вы можете выполнить более сложный вывод, добавив фильтры для поиска. Например, чтобы получить таблицу, отсортированную по дате рождения, вам нужно набрать SELECT lastname, firstname, dateofbirth FROM employees ORDER BY dateofbirth
    • Поменяйте порядок результата на противоположный, добавив DESC в конце команды.
  4. Изображение с названием 1282937 9

    4

    Введите данные через HTML-форму. Есть другие способы ввода данных в вашу новую таблицу. Один из наиболее распространенных — это с использованием формы на веб-странице. Чтобы узнать, как создать форму для заполнения вашей таблицы, смотрите соответствующее руководство.

    Реклама

Источники

Об этой статье

Эту страницу просматривали 73 999 раз.

Была ли эта статья полезной?

# Table creation with Primary Key

A primary key is a NOT NULL single or a multi-column identifier which uniquely identifies a row of a table. An index (opens new window) is created, and if not explicitly declared as NOT NULL, MySQL will declare them so silently and implicitly.

A table can have only one PRIMARY KEY, and each table is recommended to have one. InnoDB will automatically create one in its absence, (as seen in MySQL documentation (opens new window)) though this is less desirable.

Often, an AUTO_INCREMENT INT also known as «surrogate key», is used for thin index optimization and relations with other tables. This value will (normally) increase by 1 whenever a new record is added, starting from a default value of 1.

However, despite its name, it is not its purpose to guarantee that values are incremental, merely that they are sequential and unique.

An auto-increment INT value will not reset to its default start value if all rows in the table are deleted, unless the table is truncated using TRUNCATE TABLE (opens new window) statement.

# Defining one column as Primary Key (inline definition)

If the primary key consists of a single column, the PRIMARY KEY clause can be placed inline with the column definition:

This form of the command is shorter and easier to read.

# Defining a multiple-column Primary Key

It is also possible to define a primary key comprising more than one column. This might be done e.g. on the child table of a foreign-key relationship. A multi-column primary key is defined by listing the participating columns in a separate PRIMARY KEY clause. Inline syntax is not permitted here, as only one column may be declared PRIMARY KEY inline. For example:

Note that the columns of the primary key should be specified in logical sort order, which may be different from the order in which the columns were defined, as in the example above.

Larger indexes require more disk space, memory, and I/O. Therefore keys should be as small as possible (especially regarding composed keys). In InnoDB, every ‘secondary index’ includes a copy of the columns of the PRIMARY KEY.

# Basic table creation

The CREATE TABLE statement is used to create a table in a MySQL database.

Every field definition must have:

  1. Field name: A valid field Name. Make sure to encolse the names in `-chars. This ensures that you can use eg space-chars in the fieldname.
  2. Data type [Length]: If the field is CHAR or VARCHAR, it is mandatory to specify a field length.
  3. Attributes NULL | NOT NULL: If NOT NULL is specified, then any attempt to store a NULL value in that field will fail.
  4. See more on data types and their attributes here (opens new window).

Engine=... is an optional parameter used to specify the table’s storage engine.
If no storage engine is specified, the table will be created using the server’s default table storage engine (usually InnoDB or MyISAM).

# Setting defaults

Additionally, where it makes sense you can set a default value for each field by using DEFAULT:

If during inserts no Street is specified, that field will be NULL when retrieved. When no Country is specified upon insert, it will default to «United States».

You can set default values for all column types, except (opens new window) for BLOB, TEXT, GEOMETRY, and JSON fields.

# Table creation with Foreign Key

Foreign key: A Foreign Key (FK) is either a single column, or multi-column composite of columns, in a referencing table. This FK is confirmed to exist in the referenced table. It is highly recommended that the referenced table key confirming the FK be a Primary Key, but that is not enforced. It is used as a fast-lookup into the referenced where it does not need to be unique, and in fact can be a left-most index there.

Foreign key relationships involve a parent table that holds the central data values, and a child table with identical values pointing back to its parent. The FOREIGN KEY clause is specified in the child table. The parent and child tables must use the same storage engine. They must not be TEMPORARY (opens new window) tables.

Corresponding columns in the foreign key and the referenced key must have similar data types. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.

Note: foreign-key constraints are supported under the InnoDB storage engine (not MyISAM or MEMORY). DB set-ups using other engines will accept this CREATE TABLE statement but will not respect foreign-key constraints. (Although newer MySQL versions default to InnoDB, but it is good practice to be explicit.)

# Show Table Structure

If you want to see the schema information of your table, you can use one of the following:

If used from the mysql commandline tool, this is less verbose:

A less descriptive way of showing the table structure:

Both DESCRIBE and DESC gives the same result.

To see DESCRIBE performed on all tables in a database at once, see this Example (opens new window).

# Cloning an existing table

A table can be replicated as follows:

The new table will have exactly the same structure as the original table, including indexes and column attributes.

As well as manually creating a table, it is also possible to create table by selecting data from another table:

You can use any of the normal features of a SELECT statement to modify the data as you go:

Primary keys and indexes will not be preserved when creating tables from SELECT. You must redeclare them:

# CREATE TABLE FROM SELECT

You can create one table from another by adding a SELECT statement at the end of the CREATE TABLE statement:

Create a table in the same database:

Create tables from different databases:

N.B

To create a table same of another table that exist in another database, you need to specifies the name of the database like this:

# Table Create With TimeStamp Column To Show Last Update

The TIMESTAMP column will show when the row was last updated.

# Syntax

  • CREATE TABLE table_name
    (
    column_name1 data_type(size),
    column_name2 data_type(size),
    column_name3 data_type(size),
    ….
    ); // Basic table creation

  • CREATE TABLE table_name [IF NOT EXISTS]
    (
    column_name1 data_type(size),
    column_name2 data_type(size),
    column_name3 data_type(size),
    ….
    ); // Table creation checking existing

  • CREATE [TEMPORARY] TABLE table_name [IF NOT EXISTS]
    (
    column_name1 data_type(size),
    column_name2 data_type(size),
    column_name3 data_type(size),
    ….
    ); // Temporary table creation

  • CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl; // Table creation from SELECT
  • The CREATE TABLE statement should end with an ENGINE specification:

    Some options are:

    • InnoDB: (Default since version 5.5.5) It’s a transation-safe (ACID compliant) engine. It has transaction commit and roll-back, and crash-recovery capabilities and row-level locking.
    • MyISAM: (Default before version 5.5.5) It’s a plain-fast engine. It doesn’t support transactions, nor foreign keys, but it’s useful for data-warehousing.
    • Memory: Stores all data in RAM for extremely fast operations but table date will be lost on database restart.

    More engine options here (opens new window).

    Существует два популярных типа баз данных: реляционные и нереляционные. Нереляционные предполагают отказ от табличной модели хранения. В них используется модель, которая оптимально подходит под конкретные требования типа хранимых данных. Так, в нереляционных БД данные могут храниться в виде пары «ключ — значение», JSON-файлов или графов.

    Реляционные базы данных — это привычные нам таблицы с предопределёнными связями между данными. Информация хранится в строках и столбцах, и каждая строка содержит какие-то данные, относящиеся к одному объекту/сущности. Среди реляционных БД известны Oracle DB, PostgreSQL, MySQL и т. д. Давайте разберёмся, как создать MySQL таблицу, менять её и вносить данные.

    Синтаксис CREATE TABLE

    Перед созданием таблицы укажите базу данных, в которую она будет записана. Это делается командой USE:

    USE name_database;

    Для создания таблиц в MySQL используются особые запросы с указанием атрибутов таблицы. В этих запросах также описываются типы данных в атрибутах, их описание и ограничения. Самый распространённый способ создания таблиц MySQL с нуля — это с помощью инструкции CREATE TABLE. Вот пример, как создать таблицу MySQL:


    CREATE TABLE Table_Name
    (
        column_name_one column_type_one,
        column_name_two column_type_two,
        ...,
        column_name_X column_type_X,
    );

    Синтаксис простой. Table_Name — имя создаваемой таблицы (рекомендуем присваивать осмысленное имя), column_name — имя столбца, а column_type — тип данных, которые будут храниться в столбце.

    Можно создать MySQL таблицу, скопировав уже существующую. Для этого используется сочетание CREATE TABLE и SELECT. Например, так: CREATE TABLE New_Table_Name [AS] SELECT * FROM Original_Table_Name;

    Для переименования уже созданной таблицы используйте команду RENAME TABLE:

    RENAME TABLE old_name TO new_name;

    Дополнительные параметры таблиц

    В описание иногда необходимо добавлять следующие параметры:

    • PRIMARY KEY — определяем колонку или множество колонок как первичный ключ.
    • AUTO_INCREMENT— определяем, что значение колонки при появлении в таблице новых записей автоматически увеличивается. В таблице можно задавать только одну AUTO_INCREMENT колонку.
    • UNIQUE — определяем, что все значения в колонке для всех записей должны быть уникальными.
    • NOT NULL — определяем, что значения в колонке не должны быть нулевыми (Null).
    • DEFAULT — задаём значения по умолчанию. Параметр не применим к типам BLOB, TEXT, GEOMETRY и JSON.

    Названия таблиц и столбцов

    Старайтесь присваивать осмысленные названия для таблиц и столбцов, тогда и вам, и другому разработчику даже через год будет понятно, где что находится. Использование транслита или стандартных имён вроде table1/table2 не приветствуется. А вот названия Users, Sales, Calls информативны и логичны — по ним легко определить, что за данные содержатся в таблице. Аналогичный подход рекомендуется и при переименовании столбцов. Максимальная длина названия — 64 символа.

    Типы данных в MySQL

    MySQL поддерживает работу с разными типами данных. Их можно разделить на числовые, символьные, бинарные и временные типы. Расскажем детальнее о каждом.

    Числовые типы данных в MySQL

    INT

    К этому типу относятся  диапазон целочисленных значений от −2147483648 до 2147483647. Занимает в памяти 4 байта.

    DECIMAL

    Используется для хранения точных дробных чисел (число занимаемых в памяти байт зависит от выбранной точности). Может принимать два параметра DECIMAL(precision, scale). Этот тип рекомендуется для работы с  валютами и координатами.

    TINYINT 

    Используется для хранения целых чисел от −127 до 128. Занимает 1 байт памяти. Атрибут UNSIGNED позволяет запретить отрицательные значения.

    BOOL 

    Используется для однозначного ответа 0 или 1 на вопрос «false» или «true». Имеет синоним BOOLEAN.

    FLOAT 

    Используется для хранения дробных чисел с плавающей запятой (точкой) хранит до 24 знаков после запятой. Занимает 4 байта в памяти.

    Станьте нашим партнёром и получайте доход
    до 40% от каждого клиентаСтать партнёром

    Символьные типы данных в MySQL

    VARCHAR(N)

    Используется для хранения текстовых данных переменной длины. Занимаемая память зависит от длины строки. Параметр N определяет максимальную длину строки.

    CHAR(N)

    Используется для хранения данных фиксированной длины. Каждая запись занимает ровно столько памяти, сколько необходимо для хранения строки длиной N. Параметр N определяет максимальную длину строки.

    TEXT 

    Используется для хранения текстовых данных объёмом до 65 KB

    Временные типы данных в MySQL

    DATE

    Хранится только дата в диапазоне от 1000-01-01 по 9999-12-31 и формате ‘YYYY-MM-DD’. Используется для хранения дат рождения, исторических дат, начиная с 11 века. Занимает 3 байта памяти.

    TIME

    Хранится только время в диапазоне от ‘-838:59:59.00’ до ‘838:59:59.00’ и формате  ‘hh:mm:ss’. Занимает 3 байта памяти.

    DATETIME

    Объединяет дату и время в диапазоне от 1001 по 9999 год в формате: ‘YYYY-MM-DD hh:mm:ss’. Не зависит от часового пояса. Точность — до 1 секунды. Занимает 8 байт памяти.

    TIMESTAMP

    Хранит дату и время в диапазоне от ‘1970-01-01 00:00:01’ до ‘2038-01-19 03:14:07’ в виде количества секунд (и микросекунд). Занимает 4 байта памяти. Зависит от часового пояса.

    Бинарные типы данных в MySQL

    BLOB 

    Используется для хранения в бинарном виде файлов, фото, документов, аудио и видеоконтента объёмом до 65 КБ.

    LARGEBLOB 

    Используется для хранения в бинарном виде файлов, фото, документов, аудио и видеоконтента объёмом до 4 ГБ.

    Изменение структуры таблицы

    Команда ALTER TABLE позволяет быстро добавить столбцы. Можно добавить одновременно несколько столбцов с разными данными. Вот пример, как добавить в MySQL столбцы с почтой возрастом, семейным статусом сотрудников:


    ALTER TABLE Table_name
    ADD email VARCHAR(50),
    ADD age INT,
    ADD has_family BOOLEAN;

    Удаление таблицы

    Для удаления таблицы используется оператор DROP TABLE. Эта процедура навсегда удаляет все хранящиеся в таблице данные, индексы, триггеры, ограничения и разрешения. Пример команды на удаление таблицы MySQL:

    DROP TABLE Table_name;

    Будьте осторожны с командой удаления таблицы — вернуть данные обратно без наличия бэкапов будет почти невозможно.

    Понравилась статья? Поделить с друзьями:
  • Загорелся чек на приоре как исправить
  • Как автоматически найти драйвер для принтера
  • Как найти хорошего парня помогите
  • Как найти сумму без ндфл
  • Как найти людей в какао толк