1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-lmpythw-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
ex39.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 06.03.2025 03:52 f9ec0dd

Упражнение 39: Создание с помощью SQL

Оригинал: 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-lmpythw-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-lmpythw-zh.git
oschina-mirror
wizardforcel-lmpythw-zh
wizardforcel-lmpythw-zh
master