Как создать таблицу в SQL (примеры с PostgreSQL и MySQL)

0
121
views

Умение создать таблицу — важный, даже можно сказать фундаментальный навык в работе с SQL.

В этом руководстве я покажу вам синтаксис инструкции CREATE TABLE на примерах с PostgreSQL и MySQL.

Базовый синтаксис CREATE TABLE

Вот синтаксис инструкции CREATE TABLE (букв. «создать таблицу»):

CREATE TABLE table_name(
    column1 data_type column_constraint,
    column2 data_type column_constraint,
    column3 data_type column_constraint,
    column4 data_type column_constraint,
    ... etc
);

Начинаем с самой инструкции CREATE TABLE. Сразу за ней идет имя таблицы, которую вы хотите создать.

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

CREATE TABLE teachers();

В скобках указывается дополнительная информация о столбцах таблицы. Если вы забудете скобки, то получите сообщение об ошибке:

CREATE TABLE teachers;

Точка с запятой после скобок сообщает о том, что это конец SQL-инструкции.

Движки хранения данных MySQL

Согласно документации MySQL, «Движки хранения данных — это компоненты MySQL, управляющие SQL-операциями для разных типов таблиц».

MySQL использует эти движки для осуществления CRUD-операций (создание, чтение, обновление и удаление данных) в базе данных.

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

CREATE TABLE table_name(
    column1 data_type column_constraint,
    column2 data_type column_constraint,
    column3 data_type column_constraint,
    column4 data_type column_constraint,
    ... etc
)ENGINE=storage_engine;

От редакции Techrocks. Возможно, вам также будут интересны следующие статьи:


Что такое IF NOT EXISTS?

Вы можете добавить в запрос опциональное предложение IF NOT EXISTS. Оно нужно для проверки, не существует ли уже в базе данных та таблица, которую вы хотите создать. Это предложение можно поместить непосредственно перед именем таблицы.

CREATE TABLE IF NOT EXISTS teachers();

Если такая таблица существует, новая не будет создана.

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

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

CREATE TABLE IF NOT EXISTS teachers();
CREATE TABLE teachers();

Как создавать столбцы в таблице

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

В этом примере мы добавим в таблицу teachers четыре столбца: school_id, name, email и age. Имена столбцов разделяются запятыми.

CREATE TABLE teachers(
    school_id data_type column_constraint, 
    name data_type column_constraint,
    email data_type column_constraint, 
    age data_type column_constraint
);

Согласно документации MySQL, «В MySQL установлено жесткое ограничение в 4096 столбцов на таблицу, но эффективный максимум может быть меньше. Реальный лимит количества столбцов зависит от нескольких факторов».

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

Согласно документации PostgreSQL, в этой СУБД установлен лимит в 1600 столбцов на таблицу. Так же, как и в MySQL, максимальное число столбцов может варьироваться в зависимости от количества места на диске или ограничений производительности.

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

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

В SQL есть шесть популярных категорий типов данных:

  • числа (int, float, serial, decimal)
  • дата и время (timestamp, data, time)
  • символы и строки (char, varchar, text)
  • Unicode (ntext, nvarchar)
  • бинарные данные (binary)
  • смешанные (xml, table и др.)

Здесь мы не будем разбирать все типы, затронем только самые популярные. Полный список возможных типов данных можно посмотреть в документации: для PostgreSQL и для MySQL.

Что такое SERIAL и AUTO_INCREMENT?

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

Мы можем указать тип данных SERIAL сразу после имени столбца school_id в нашей таблице teachers.

school_id SERIAL

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

school_id INT AUTO_INCREMENT

Если мы добавим в таблицу teachers пять строк и выведем содержимое столбца school_id, будут показаны числа 1, 2, 3, 4, 5. Число автоматически возрастает для каждой новой строки.

Что из себя представляет тип данных VARCHAR?

VARCHAR — это строковые данные переменной длины, где можно установить максимальную длину символов.

Ниже показан пример использования типа данных VARCHAR для столбцов name и email в таблице teachers. Здесь установлена максимальная длина в 30 символов.

name VARCHAR(30) column_constraint,
email VARCHAR(30) column_constraint,

Ограничения столбцов

Ограничения — это правила, которые должны соблюдаться относительно данных в столбцах таблицы.

Вот список нескольких самых распространенных ограничений столбцов:

  • PRIMARY KEY — если для столбца установлено это ограничение, данные в нем становятся уникальными идентификаторами строк в таблице
  • FOREIGN KEY — этот ключ связывает данные в одной таблице с данными в другой
  • UNIQUE — все значения в столбце должны быть уникальными
  • NOT NULL — значения не могут быть NULL. NULL — это отсутствие значения
  • CHECK — проверка значения на соответствие логическому выражению

Примеры PRIMARY и FOREIGN ключей

Давайте добавим ограничение PRIMARY KEY (первичный ключ) для столбца school_id в нашей таблице teachers.

В PostgreSQL код будет выглядеть так:

school_id SERIAL PRIMARY KEY

А в MySQL — так:

school_id INT AUTO_INCREMENT PRIMARY KEY

Первичный ключ может быть составным, т. е. строка может уникально идентифицироваться двумя столбцами. Чтобы установить PRIMARY KEY для нескольких столбцов, эту инструкцию нужно добавить сразу после создания самих столбцов:

CREATE TABLE table_name(
    column1 data_type column_constraint,
    column2 data_type column_constraint,
    column3 data_type column_constraint,
    column4 data_type column_constraint,
    ... etc
    PRIMARY KEY (column1, column2)
);

Если вы хотите связать одну таблицу с другой, следует использовать FOREIGN KEY (внешний ключ).

Допустим, у нас есть таблица district_employees с первичным ключом district_id. Вот как будет выглядеть код в PostgreSQL:

CREATE TABLE district_employees(
   district_id SERIAL PRIMARY KEY,
   employee_name VARCHAR(30) NOT NULL,
   PRIMARY KEY(district_id)
);

В таблице teachers мы можем установить связь с таблицей district_employees при помощи внешнего ключа:

district_id INT REFERENCES district_employees(district_id),
CREATE TABLE teachers(
    school_id SERIAL PRIMARY KEY,
    district_id INT REFERENCES district_employees(district_id),
    column1 data_type column_constraint,
    column2 data_type column_constraint,
    column3 data_type column_constraint,
    column4 data_type column_constraint,
    ... etc 
);

Примеры NOT NULL, CHECK и UNIQUE

Если бы нам нужно было обеспечить отсутствие значений NULL в столбцах, мы могли бы прописать ограничение NOT NULL.

name VARCHAR(30) NOT NULL

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

Если одно из значений не соответствует условию, мы получим сообщение об ошибке.

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

email VARCHAR(30) UNIQUE

Вот так выглядит наша таблица teachers в итоге:

Полный код в PostgreSQL:

CREATE TABLE teachers(
    school_id SERIAL PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    email VARCHAR(30) UNIQUE,
    age INT CHECK(age >= 18)      
);

И в MySQL:

CREATE TABLE teachers(
    school_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    email VARCHAR(30) UNIQUE,
    age INT CHECK(age >= 18)      
);

Надеюсь, эта статья была вам полезна!

Перевод статьи «How to Create a Table in SQL – Postgres and MySQL Example Query».

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here