Оригинал: Exercise 39: Creating with SQL
Переводчик: [Феликс Ли]
Лицензия: CC BY-NC-SA 4.0
Гордо использует Google Translate
Когда мы говорим о сокращении "CRUD", буква "С" означает "создание". Это означает не только создание таблиц, но также внесение данных в эти таблицы и использование этих таблиц и вставок для связи между ними. Поскольку нам нужны некоторые таблицы и данные для выполнения остальной части CRUD (создание, чтение, обновление, удаление), мы начинаем изучать, как выполнять самые базовые операции создания в SQL.
Я сказал в введении, что можно выполнять "CRUD"-операции над данными внутри таблиц. Как вы можете создать таблицы? Выполняя CRUD над схемой базы данных. Первый SQL-синтаксис, который вам следует изучить — это CREATE
:
CREATE TABLE person (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER
);
Вы можете поместить его в одну строку, но я хочу обсудить каждую строку отдельно, поэтому он представлен несколькими строками. Вот что делает каждая строка:
ex1.sql:1
Начало CREATE TABLE
, которое указывает имя таблицы person
. После этого раздела вы помещаете поля, которые хотите использовать, в скобках.
ex1.sql:2
Поле id
, которое используется для точной идентификации каждой строки. Формат поля — NAME TYPE
, а здесь я предполагаю, что мне нужен INTEGER
, который также является PRIMARY KEY
. Это говорит SQLite3, чтобы он специальным образом обрабатывал это поле.
ex1.sql:3~4
Поля first_name
и last_name
. Оба являются TEXT
.
ex1.sql:5
Поле age
, просто INTEGER
.
ex1.sql:6
Заключение списка полей с круглыми скобками, после чего следует точка с запятой (;
).
Создание одной таблицы не особенно практично. Я хотел бы, чтобы вы сейчас создали три таблицы, где вы могли бы хранить данные.
CREATE TABLE person (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER
);
CREATE TABLE pet (
id INTEGER PRIMARY KEY,
name TEXT,
breed TEXT,
age INTEGER,
dead INTEGER
);
```CREATE TABLE person_pet (
person_id INTEGER,
pet_id INTEGER
);
```В этом файле вы создаете таблицы для двух типов данных, а затем «связываете» их с третьей таблицей. Люди называют эти "связи" "отношениями", но очень глупые люди без жизни называют все таблицы "отношениями" и стараются запутать тех, кто хочет выполнить работу. В моей книге таблицы с данными являются "таблицами", а таблицы, связывающие друг с другом, называются "отношениями". Здесь нет ничего нового, за исключением того, что если вы заметите `person_pet`, то увидите, что я уже создал две колонки: `person_id` и `pet_id`. Соединение двух таблиц осуществляется простым внесением одной строки в `person_pet`. Эта таблица хранит значения ID колонок двух строк, которые вы хотите соединить. Например, если `person` содержит строку с `id = 20`, а `pet` имеет строку с `id = 98`, и предположим, что этот человек владеет этим питомцем, тогда вы вносите `person_id = 20, pet_id = 98` в таблицу отношений `person_pet`.
В этом файле вы создаете таблицы для двух типов данных, а затем «соединяете» их с третьей таблицей. Люди называют эти "соединения" "отношениями", но некоторые люди без опыта называют все таблицы "отношениями" и пытаются запутать тех, кто хочет выполнять работу. В моей книге таблицы с данными являются "таблицами", а таблицы, связывающие данные, называются "отношениями". Здесь нет ничего нового, за исключением того, что если вы заметите `person_pet`, то увидите, что я уже создал две колонки: `person_id` и `pet_id`. Соединение двух таблиц осуществляется путём добавления одной строки в `person_pet`. Эта таблица хранит значения ID колонок двух строк, которые вы хотите соединить. Например, если `person` содержит строку с `id = 20`, а `pet` имеет строку с `id = 98`, и предположим, что этот человек владеет этим питомцем, тогда вы добавляете `person_id = 20, pet_id = 98` в таблицу отношений `person_pet`.В следующих нескольких упражнениях мы действительно будем вносить такие данные.
## Вставка данных
У вас есть несколько таблиц для работы, поэтому теперь я попрошу вас использовать команду `INSERT`, чтобы поместить некоторые данные:
```sql
INSERT INTO person (id, first_name, last_name, age)
VALUES (0, "Zed", "Shaw", 37);
INSERT INTO pet (id, name, breed, age, dead)
VALUES (0, "Fluffy", "Unicorn", 1000, 0);
INSERT INTO pet VALUES (1, "Gigantor", "Robot", 1, 1);
В этом файле я использую два разных варианта команды INSERT
. Первый вариант представляет собой более явный стиль, который наиболее вероятно вам следует использовать. Он указывает колонки, которые будут заполнены, после чего следует VALUES
, затем данные, которые должны быть вставлены. Оба списка (колонки и значения) заключаются в скобках и разделены запятой.
Второй вариант на седьмой строке является сокращённой версией, которая не указывает колонки, а полагается на неявный порядок колонок в таблице. Этот формат опасен, так как вы не знаете, какие именно колонки ваш запрос будет использовать, и некоторые базы данных не гарантируют надёжность порядка колонок. Лучше всего использовать этот формат только при крайней лени.
В последнем разделе вы заполняли таблицы людьми и животными. Единственное, что ещё остаётся сделать — это указать, кто владеет какими животными, эти данные помещаются в таблицу person_pet
, как показано ниже:```sql
INSERT INTO person_pet (person_id, pet_id) VALUES (0, 0);
INSERT INTO person_pet VALUES (0, 1);
Я снова использую явный формат, а затем сокращённый. Я использую значение `id` строки таблицы `person` (в данном случае `0`) и значение `id` строки таблицы `pet` (опять же, `0` — это единорог, `1` — мёртвый робот). Затем мы вносим одну строку в таблицу отношений `person_pet` для каждого "соединенния" между человеком и животным.## Упражнение-вызов
Создайте еще одну базу данных, но создайте другие поля типа `INTEGER` и `TEXT` для других объектов, которыми может владеть `person`.
В этих таблицах я создал третью связывающую таблицу для их соединения. Как вы можете избавиться от этой связывающей таблицы `person_pet`, и как можно элегантно поместить эту информацию в `person`? Какие подразумеваются изменения?
Если вы можете вставить одну запись в `person_pet`, то можете ли вы вставить несколько записей? Как вы будете регистрировать сумасшедшую леди с 50 кошками?
Создайте еще одну таблицу для автомобилей, которыми могут владеть люди, и создайте соответствующую связывающую таблицу.
Поищите в вашем любимом поисковике "sqlite3 data types", а затем прочтите [документацию SQLite3 по типам данных](https://sqlite.org/datatype3.html). Запишите, какие типы данных вы можете использовать, а также что-то важное, что вам следует знать. Мы вернемся к этому позднее.
Введите свои данные и данные ваших питомцев (или, как в моем случае, виртуальных питомцев).
Если вы измените базу данных из предыдущего упражнения, чтобы она больше не содержала таблицу `person_pet`, используйте этот шаблон для создания новой базы данных и внесите те же данные в эту базу данных.
Обратитесь к списку типов данных и запишите необходимый формат для каждого типа. Например, обратите внимание на количество способов записи `TEXT` данных.+ Добавьте связи между вами и вашими питомцами.
+ Может ли одна собака принадлежать более чем одному человеку при использовании данной таблицы? Логически это возможно? А домашние собаки? Строго говоря, не каждый член семьи имеет свою собственную домашнюю собаку?
+ Учитывая вышеупомянутое, и имея в виду альтернативный дизайн, который помещает `pet_id` в таблицу `person`, какой дизайн лучше всего подходит для данной ситуации? ## Подробное изучениеПожалуйста, ознакомьтесь с [документацией SQLite3 команды `CREATE`](https://sqlite.org/lang_createtable.html) и просмотрите как можно больше других команд `CREATE`. Также рекомендуется ознакомиться с [документацией команды `INSERT`](https://sqlite.org/lang_insert.html), что должно помочь вам найти множество других страниц.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )