SQL-Урок 14. Создание таблиц (CREATE TABLE)
Язык SQL используется не только для обработки информации, но и предназначен для выполнения всех операций с базами данных и таблицами, включая создание таблиц и работу с ними.
Существует два способа создания таблиц, используя:
Следует отметить, что, когда вы используете интерактивный инструментарий СУБД, на самом деле вся работа выполняется операторами SQL, то есть интерфейс сам создает эти команды незаметно для пользователя (это подобно записи макроса в Excel, когда макрорекодер записывает ваши действия и превращает их в команды VBA).
1. Создание таблиц
Для создания таблиц программным способом используют оператор CREATETABLE. Для этого нужно указать следующие данные:
Давайте создадим новую таблицу и назовем ее Customers:
CREATE TABLE Customers ( ID CHAR(10) NOT NULL Primary key, Custom_name CHAR(25) NOT NULL, Custom_address CHAR(25) NULL, Custom_city CHAR(25) NULL, Custom_Country CHAR(25) NULL, ArcDate CHAR(25) NOT NULL, DEFAULT NOWO)
Да, мы сначала указываем название новой таблицы, затем в скобках перечисляем столбцы, которые будем создавать, причем их названия не могут повторяться в пределах одной таблицы. После названий столбцов указывается тип данных для каждого поля (CHAR(10)), затем указываем может поле содержать пустые значения (NULL или NOT NULL), а также нужно указать поле, которое будет первичным ключом (Primary keytbl.
Язык SQL также позволяет определять для каждого поля значение по умолчанию, то есть если пользователь не укажет значение для определенного поля — оно будет автоматически проставлено СУБД. Значение по умолчанию определяется ключевым словом DEFAULT при определении столбцов оператором CREATE TABLE.
2. Обновление таблиц
Для того чтобы изменить таблицу в SQL используется оператор ALTER TABLE. При использовании данного оператора следует ввести следующую информацию:
Например, давайте добавим новую колонку в таблицу Sellers, в которой будем указывать телефон реализатора:
ALTER TABLE Sellers ADD Phone CHAR (20)
Помимо добавления столбцов мы также можем их удалять. Давайте теперь удалим поле Phone. Для этого пропишем следующий запрос:
ALTER TABLE Sellers DROP COLUMN Phone
3. Удаление таблиц
Удаление таблиц осуществляется с помощью оператора DROP TABLE. Чтобы удалить таблицу Sellers_new, мы можем прописать следующий запрос:
DROP TABLE Sellers_new
Во многих СУБД применяются правила, предотвращающие удаление таблиц, которые уже связаны с другими таблицами. Если эти правила действуют и вы удаляете такую таблицу, то СУБД блокирует операцию удаления до тех пор пока не будет удалена связь. Такие меры предотвращают случайное удаление нужных таблиц.
- Изменение регистра букв в тексте
- Сумма прописью на украинском языке
- Поиск латиницы в кириллице и наоборот
- Транслитерация с украинского на английский
Создание и изменение таблиц или индексов с помощью запроса определения данных
Вы можете создавать и изменять таблицы, ограничения, индексы и связи в Access, написав запросы определения данных SQL представлении. В этой статье объясняется, как использовать запросы определения данных для создания таблиц, ограничений, индексов и связей. Эта статья также поможет вам решить, когда использовать запрос на определение данных.
В этой статье
- Обзор
- Создание и изменение таблицы
- Создание индекса
- Создание ограничения или связи
Обзор
В отличие от других запросов Access, запрос определения данных не извлекает данные. Вместо этого запрос определения данных использует язык определения данных для создания, изменения или удаления объектов базы данных.
Примечание: Язык определения данных (DDL) является частью язык SQL (SQL).
Запросы определения данных могут быть очень удобными. Вы можете регулярно удалять и повторно создавать части схемы базы данных, просто выполнав некоторые запросы. Запрос на определение данных следует использовать, если вы знакомы с SQL и планируете удалить и повторно создать определенные таблицы, ограничения, индексы или связи.
Предупреждение: Использование запросов определения данных для изменения объектов базы данных может быть рискованным, поскольку действия не сопровождаются диалогами подтверждения. Если вы допустили ошибку, вы можете потерять данные или непреднамеренно изменить оформление таблицы. Будьте осторожны при использовании запроса определения данных для изменения объектов в базе данных. Если вы не несете ответственности за обслуживание используемой базы данных, перед запуском запроса на определение данных обратитесь к ее администратору.
Важно: Перед выполнением запроса на определение данных сделайте резервную копию всех таблиц.
Ключевые слова DDL
Ключевое слово
Использование групп
Создайте индекс или таблицу, которые еще не существуют.
Измените существующую таблицу или столбец.
Удалите существующую таблицу, столбец или ограничение.
Добавьте столбец или ограничение в таблицу.
Использование с add, ALTER или DROP
Использование с add, ALTER или DROP
Использование с помощью create
Использование с alter, CREATE или DROP
Создание и изменение таблицы
Для создания таблицы используется команда CREATE TABLE. Команда CREATE TABLE имеет следующий синтаксис:
CREATE TABLE table_name
(field1 type [(size)] [NOT NULL] [index1]
[, field2 type [(size)] [NOT NULL] [index2]
[, . ][, CONSTRAINT constraint1 [, . ]])
Для команды CREATE TABLE требуются только команды CREATE TABLE и имя таблицы, но обычно требуется определить некоторые поля или другие аспекты таблицы. Рассмотрим этот простой пример.
Предположим, вам нужно создать таблицу для хранения названия, года и цены используемых автомобилей, которые вы хотите приобрести. Вы хотите разрешить в имени до 30 знаков и 4 знака для года. Чтобы создать таблицу с помощью запроса определения данных, сделайте следующее:
Примечание: Для выполнения запроса определения данных может потребоваться сначала включить содержимое базы данных:
- Нажмите на панели сообщений кнопку Включить содержимое.
Создание таблицы
- На вкладке «Создание» в группе «Макрос &» нажмите кнопку «Конструктор запросов».
- На вкладке «Конструктор» в группе «Тип запроса» нажмите кнопку «Определение данных». Сетка конструктора скрыта, SQL в представлении отображается вкладка объекта.
- Введите следующую SQL: CREATE TABLE Cars (Name TEXT(30), Year TEXT(4), Price CURRENCY)
- На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
Изменение таблицы
Для изменения таблицы используется команда ALTER TABLE. Для добавления, изменения или удаления столбцов или ограничений можно использовать команду ALTER TABLE. Команда ALTER TABLE имеет следующий синтаксис:
ALTER TABLE table_name predicate
где предика может быть любым из следующих:
ADD COLUMN field type[(size)] [NOT NULL] [CONSTRAINT constraint]
ADD CONSTRAINT multifield_constraint
ALTER COLUMN field type[(size)]
DROP COLUMN field
DROP CONSTRAINT constraint
Предположим, что вы хотите добавить 10-знаковое текстовое поле для хранения сведений о состоянии каждого автомобиля. Здесь доступны перечисленные ниже возможности
- На вкладке «Создание» в группе «Макрос &» нажмите кнопку «Конструктор запросов».
- На вкладке «Конструктор» в группе «Тип запроса» нажмите кнопку «Определение данных». Сетка конструктора скрыта, SQL в представлении отображается вкладка объекта.
- Введите следующую SQL: ALTER TABLE Cars ADD COLUMN Condition TEXT(10)
- На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
Создание индекса
Чтобы создать индекс в существующей таблице, используйте команду CREATE INDEX. Команда CREATE INDEX имеет следующий синтаксис:
CREATE [UNIQUE] INDEX index_name
ON table (field1 [DESC][, field2 [DESC], . ])
[WITH ]
Требуются только команды CREATE INDEX, имя индекса, аргумент ON, имя таблицы с полями, которые требуется индексировать, и список полей, которые нужно включить в индекс.
- Аргумент DESC вызывает упорядочение индекса по убытию (это может быть полезно при частом запуске запросов, которые искать верхние значения для индекса поля или сортировки индекса в порядке убыния). По умолчанию индекс создается в порядке возрастания.
- Аргумент WITH PRIMARY устанавливает индексные поля или поля в первичный ключ таблицы.
- Аргумент WITH DISALLOW NULL требует, чтобы индекс требовал в введенное значение для индексного поля, то есть не допускается использовать значения NULL.
Предположим, что у вас есть таблица «Автомобили» с полями, в которым хранятся имя, год, цена и условия использования автомобилей, которые вы хотите приобрести. Предположим также, что таблица стала большой и вы часто включаете в запросы поле «Год». Чтобы запросы быстро возвращали результаты, можно создать индекс для поля Year, вы используя следующую процедуру:
- На вкладке «Создание» в группе «Макрос &» нажмите кнопку «Конструктор запросов».
- На вкладке «Конструктор» в группе «Тип запроса» нажмите кнопку «Определение данных». Сетка конструктора скрыта, SQL в представлении отображается вкладка объекта.
- Введите следующую SQL: CREATE INDEX YearIndex ON Cars (Year)
- На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
Создание ограничения или связи
Ограничение — это логическое условие, которое должно соответствовать полю или сочетанию полей при вставке значений. Например, ограничение UNIQUE не позволяет полю с ограниченными ограничениями принять значение, которое будет дублироваться существующее значение в поле.
Связь — это тип ограничения, которое ссылается на значения поля или сочетания полей в другой таблице, чтобы определить, можно ли вставить значение в поле с ограничениями или сочетание полей. Специальное ключевое слово не указывает на то, что ограничение является связью.
Чтобы создать ограничение, используйте предложение CONSTRAINT в команде CREATE TABLE или ALTER TABLE. Существует два типа предложений CONSTRAINT: одно — для создания ограничения на одно поле, а другое — для ограничения нескольких полей.
Ограничения по одному полю
Предложение CONSTRAINT по одному полю должно следовать за определением поля, которое его ограничивает, и имеет следующий синтаксис:
CONSTRAINT constraint_name REFERENCES foreign_table [(foreign_field)]
[ON UPDATE ]
[ON DELETE ]>
Предположим, что у вас есть таблица «Автомобили» с полями, в которым хранятся имя, год, цена и условия использования автомобилей, которые вы хотите приобрести. Кроме того, предположим, что вы часто забудете ввести значение для условия автомобиля и всегда хотите записать эти сведения. Вы можете создать ограничение для поля «Условие», чтобы не оставить его пустым, вы можете сделать следующее:
- На вкладке «Создание» в группе «Макрос &» нажмите кнопку «Конструктор запросов».
- На вкладке «Конструктор» в группе «Тип запроса» нажмите кнопку «Определение данных». Сетка конструктора скрыта, SQL в представлении отображается вкладка объекта.
- Введите следующую SQL: ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT ConditionRequired NOT NULL
- На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
Предположим, что через некоторое время в поле «Условие» есть много похожих значений, которые должны быть одинаковыми. Например, у одних автомобилей плохое значение, а у других — плохое.
Примечание: Если вы хотите следовать остальным процедурам, добавьте поддельные данные в таблицу «Автомобили», созданную на предыдущих шагах.
После очистки значений, чтобы они были согласованы, можно создать таблицу с именем CarCondition с одним полем с именем Condition, которое содержит все значения, которые вы хотите использовать для условия автомобиля:
Примечание: На SQL этого шага есть запрос на добавление. В отличие от запроса на определение данных, запрос на приложение заканчивается за заданной осью 1.
Создание связи с помощью ограничения
Чтобы требовать, чтобы любое новое значение, вставленное в поле «Условие» таблицы «Автомобили», совпадала со значением поля Condition в таблице CarCondition, вы можете создать связь между carCondition и Cars в поле «Условие», используя следующую процедуру:
- На вкладке «Создание» в группе «Макрос &» нажмите кнопку «Конструктор запросов».
- На вкладке «Конструктор» в группе «Тип запроса» нажмите кнопку «Определение данных». Сетка конструктора скрыта, SQL в представлении отображается вкладка объекта.
- Введите следующую SQL: ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT FKeyCondition REFERENCES CarCondition (Condition)
- На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
Ограничения на несколько полей
Предложение CONSTRAINT с несколькими полями может использоваться только за пределами предложения определения поля и имеет следующий синтаксис:
CONSTRAINT constraint_name
UNIQUE (unique1[, unique2[, . ]]) |
NOT NULL (notnull1[, notnull2[, . ]]) |
FOREIGN KEY [NO INDEX] (ref_field1[, ref_field2[, . ]])
REFERENCES foreign_table
[(fk_field1[, fk_field2[, . ]])] |
[ON UPDATE ]
[ON DELETE ]>
Рассмотрим еще один пример, в который используется таблица «Автомобили». Предположим, что две записи в таблице «Автомобили» не имеют одного и того же набора значений для значений «Имя», «Год», «Условие» и «Цена». Чтобы создать ограничение UNIQUE, применяемое к этим полям, с помощью следующей процедуры:
- На вкладке «Создание» в группе «Макрос &» нажмите кнопку «Конструктор запросов».
- На вкладке «Конструктор» в группе «Тип запроса» нажмите кнопку «Определение данных». Сетка конструктора скрыта, SQL в представлении отображается вкладка объекта.
- Введите следующую SQL: ALTER TABLE Cars ADD CONSTRAINT NoDupes UNIQUE (имя, год, условие, цена)
- На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
Создание таблиц — Основы реляционных баз данных
В этом уроке мы поработаем с таблицами: будем создавать их, добавлять, модифицировать и удалять данные. Также разберем типы данных таблицы.
Создание базы данных
Прежде чем создать таблицу, создадим базу данных hexlet с помощью SQL (если вы еще этого не сделали). Для этого подключитесь к СУБД через psql . При этом не указывайте базу данных, чтобы подключиться к базе по умолчанию. Далее выполните следующие запросы:
DROP DATABASE hexlet; CREATE DATABASE hexlet;
В примере выше два SQL запроса:
- DROP DATABASE hexlet — удаляет базу данных с именем hexlet
- CREATE DATABASE hexlet — создает базу данных с таким же именем
Базовые правила построения запросов:
- Каждый запрос должен заканчиваться точкой с запятой. Иначе psql будет думать, что вы продолжаете вводить команды
- Регистр не важен. Можно было написать drop database hexlet; . По традиции принято использовать верхний регистр для ключевых слов самого SQL. Это позволяет визуально разделять структуру запроса от данных внутри него. Последнее в примере — это имя базы данных, которое может быть произвольным
Если подключиться к той же базе данных, которую вы хотите удалить или пересоздать, то во время попытки удаления СУБД будет ругаться, что к базе есть активное соединение — ваше соединение. Поэтому важно подключиться к любой другой базе данных.
Команды createdb и createuser , которые мы разобрали в прошлых уроках, выполняют SQL-запросы внутри СУБД. Их сделали ради удобства первоначальной настройки, и чтобы использовать в скриптах автоматизации.
SQL поддерживает комментарии — строчка, которая начинается с двух дефисов. Комментарии игнорируются СУБД при построении запросов:
hexlet=> -- i am comment hexlet=>
Нам удалось создать базу данных hexlet , поэтому можно переходить к созданию таблицы.
Создание таблиц
Таблица создается с помощью запроса CREATE TABLE :
-- Это один запрос, хоть и многострочный. -- Описание запроса заканчивается символом ; CREATE TABLE courses ( name varchar(255), slug varchar(255), lessons_count integer, body text );
Чтобы создать таблицу, необходимо указать ее имя, набор полей и их типы. В примере выше названия полей — это name , slug , lessons_count и body , а varchar(255) , integer и text — их типы.
Типы данных
У каждого поля в PostgreSQL определенный тип, который задается на этапе создания таблицы. Это значит, что значением этого поля могут быть только определенные данные. Если поле имеет числовой тип, то в него невозможно вставить строку, и наоборот. База данных выдаст ошибку при попытке выполнить подобный запрос.
-- Выполняем запрос на вставку передавая в lessons_count строку вместо числа ERROR: invalid input syntax for type integer: "wrong value"
В PostgreSQL встроено много различных типов данных, но на практике используются не все. Ниже мы разбираем только самые популярные типы.
Строки
Для строк в базах данных в основном используются два типа:
- varchar — для строк с ограничением максимальной длины
- text — для строк без ограничения. Как правило, это полноценные тексты
В базах данных нельзя оставить первый тип без указания длины. Это связано с производительностью и эффективностью. Данные в базах данных физически хранятся на дисках в файлах. Быстрый доступ к этим данным возможен только тогда, когда у данных фиксированный размер. Это позволяет быстро перемещаться по ним и считать смещения.
Если размер данных не известен, то придется просматривать весь файл в поисках нужного значения. Чтобы избежать подобной ситуации, тип text хранится отдельно. Это тоже негативно влияет на скорость, но уже не так сильно. Если размер строки известен или он меньше какого-то значения, то предпочтительнее использовать varchar.
Имя | Описание |
---|---|
character varying(n), varchar(n) | строка ограниченной переменной длины |
text | строка неограниченной переменной длины |
- varchar. Полное название типа character varying (varchar может использоваться как псевдоним). Размер строки с таким типом указывается в скобках после названия типа, например, varchar(10). Это значит, что в поле с таким типом можно записать строку длиной до 10 символов.
- text. Не требует указания размера и может содержать текст произвольной длины
Пример создания таблицы с такими типами:
CREATE TABLE blog_posts ( name varchar(80), body text );
Числа
Для чисел в основном используются два типа данных: integer и bigint. Какой конкретно указывать тип, зависит от потенциального потолка значения. Ниже указаны диапазоны, допустимые в рамках этих типов:
Имя | Описание | Диапазон |
---|---|---|
integer | типичный выбор для целых чисел | -2147483648 .. +2147483647 |
bigint | целое в большом диапазоне | -9223372036854775808 .. 9223372036854775807 |
Пример создания таблицы с такими типами:
CREATE TABLE users ( id bigint, age integer );
Даты
Типы для хранения дат отличаются друг от друга очень сильно, в первую очередь по решаемой задаче. Нам надо хранить день без конкретного времени? Это тип date. Нужно конкретный момент времени, тогда timestamp. Просто время без даты? Тогда time.
Имя | Описание | Наименьшее значение | Наибольшее значение | Точность |
---|---|---|---|---|
timestamp | дата и время (без часового пояса) | 4713 до н. э. | 294276 н. э. | 1 микросекунда |
date | дата (без времени суток) | 4713 до н. э. | 5874897 н. э. | 1 день |
time | время суток (без даты) | 00:00:00 | 24:00:00 | 1 микросекунда |
Пример создания таблицы с такими типами:
CREATE TABLE events ( start_date date, -- имя поля может называться как тип данных time time, updated_at timestamp, created_at timestamp );
Хорошей практикой считается добавление и заполнение полей created_at и updated_at в каждую таблицу базы данных. С их помощью всегда можно узнать, когда запись создалась и обновилась.
Значения даты и времени принимаются практически в любом известном формате. Вот несколько примеров того, как можно задавать дату:
Пример | Описание |
---|---|
1999-01-08 | ISO 8601 (рекомендуемый формат) |
January 8, 1999 |
Логический тип
Содержит всего два значения: true и false . Этот тип используется для флагов:
Имя | Описание |
---|---|
boolean | true или false (истина или ложь) |
Пример создания таблицы с такими типами:
CREATE TABLE blog_posts ( -- флаг: опубликован? published boolean );
Состояние «true» может задаваться следующими значениями:
Для состояния «false» можно использовать следующие варианты:
Помимо типов данных для реальных значений, в базе существует специальное значение NULL , чтобы обозначать пустоту. Оно используется, когда у конкретного поля нет значения. Тип поля при этом не важен. Подробнее с NULL мы разберемся в следующих уроках.
Анализ структуры базы данных
Чтобы исследовать структуру таблиц в визуальном режиме, используется PgAdmin:
SQL для анализа структуры базы данных не существует. Если вы хотите посмотреть список таблиц и их структуру в базе данных, то придется использовать команды самого psql :
Просмотр списка таблиц базы данных hexlet
hexlet=> \d List of relations Schema | Name | Type | Owner --------+------------+-------+--------- public | courses | table | vagrant public | events | table | vagrant public | blog_posts | table | vagrant
Здесь мы видим список таблиц в базе данных hexlet. Все что здесь отображается, было создано в этом уроке выше.
В первом столбце видим новое для нас понятие — schema. Это пространство имен, которое позволяет группировать таблицы, в различных ситуациях. На практике эта возможность используется редко, поэтому мы не обращаем на нее внимание. По умолчанию все таблицы публикуются в общей схеме public, которую можно не указывать.
Просмотр структуры таблицы courses
hexlet=> \d courses # public - обозначает схему по умолчанию Table "public.courses" Column | Type | Modifiers ---------------+------------------------+----------- name | character varying(255) | slug | character varying(255) | lessons_count | integer | body | text |
В этом выводе показана структура таблицы courses. Здесь мы видим все имена полей и их типы.
Кроме перечисленных полезными могут оказаться следующие команды:
- \l — список всех баз данных
- \dt — список всех таблиц
- \? — вывод справки
Удаление таблиц
Чтобы удалить таблицу, выполняется запрос DROP :
DROP TABLE courses;
Будьте внимательны, так как удаление таблицы приводит к безвозвратной потере данных.
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
SQL — Урок 3. Создание таблиц и наполнение их информацией
Итак, мы познакомились с типами данных, теперь будем усовершенствовать таблицы для нашего форума. Сначала разберем их. И начнем с таблицы 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 может быть только один. В первом уроке мы удалили нашу БД forum, пришло время создать ее вновь.
Запускаем сервер 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-запроса на внесение данных в базу. Писать сценарии на php мы пока не умеем, а вот отправлять 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 пользователей, то не существует):
Сервер выдает ошибку и говорит, что не может внести такую строку, т.к. в поле, являющемся внешним ключом, стоит значение, отсутствующее в связанной таблице users.
Теперь внесем несколько строк в таблицу posts (сообщения), помня, что в ней у нас 2 внешних ключа, т.е. id_author и id_topic, которые мы будем вносить должны присутствовать в связанных с ними таблицах:
Итак, у нас есть 3 таблицы, в которых есть данные. Встает вопрос — как посмотреть, какие данные хранятся в таблицах. Этим мы и займемся на следующем уроке.
Онлайн-курс. Освойте востребованную профессию с зарплатой от 70 000 руб в месяц!
Теперь нажмите кнопку, что бы не забыть адрес и вернуться к нам снова.
admin@site-do.ru
site-do.ru © 2009-2019 Копировать материалы сайта запрещено!
За нарушение авторских прав предусмотрена уголовная ответственность!
Телефон редакции +7(499)346-89-56
127051, г.Москва, Цветной бульвар, д. 11, стр. 6, офис 405.