Основы моделирования и базы данных

Базовые операции SQL. Часть 1

В материале разбирается практика начального заполнения реляционной базы данных «Синема» в среде SQL Server Management Studio. Изложение выстроено от простого к сложному: сначала демонстрируется правильная последовательность обработки таблиц по иерархии внешних ключей, затем ручной ввод через графический интерфейс. Обнаружив неудобство ручного присвоения первичных ключей, автор показывает настройку автоинкремента (identity). Далее переходит к написанию SQL-запросов INSERT: построчная вставка, вставка нескольких строк, указание конкретных столбцов при пропуске необязательных полей и корректное обрамление зарезервированных слов квадратными скобками.

Основные мысли

В результате изучения лекции слушатель будет способен:
1. Определять корректную очерёдность заполнения связанных таблиц на основе родительско-дочерних зависимостей.
2. Выполнять ручной ввод данных в таблицу через интерфейс «Edit Top 200 Rows».
3. Настраивать автоинкрементное свойство (IDENTITY) для столбца первичного ключа в режиме Design.
4. Снимать ограничение на сохранение изменений, требующих пересоздания таблицы.
5. Формировать SQL-запрос INSERT для вставки одной строки с перечислением значений.
6. Записывать один INSERT-запрос на несколько строк с помощью группировки VALUES через запятую.
7. Указывать конкретный перечень заполняемых столбцов при частичной вставке строки.
8. Заключать в квадратные скобки имена объектов, совпадающие с зарезервированными словами T-SQL.
9. Устанавливать контекст базы данных командой USE.
10. Аргументировать необходимость автоматической генерации суррогатных ключей вместо ручного присвоения.
Показывать лекцию целиком
Краткое изложение
Порядок заполнения таблиц

Рассмотрим построенную схему базы данных Cinema. На диаграмме видны таблицы и связи между ними. Прежде чем заполнять дочерние таблицы, ссылающиеся по внешнему ключу, необходимо заполнить родительские. Начинать следует с таблиц, которые являются только родительскими и не наследуют внешние ключи. Самая старшая в иерархии — таблица City (города).

Заполнение таблицы City через интерфейс

В списке таблиц находим dbo.City. Щёлкнув правой кнопкой, выбираем Edit Top 200 Rows — режим редактирования первых двухсот строк. Здесь можно вносить данные. Первое поле — ID (идентификатор), второе — CityName. Вводим вручную:
• 1, Москва
• 2, Рязань
• 3, Тула

Окно редактирования автоматически сохраняет каждое изменение, дополнительно подтверждать сохранение не нужно. Убедиться в наличии записей можно командой Select Top 1000 Rows, которая возвращает первые тысячи строк.

Недостаток ручного ввода идентификаторов и настройка автоинкремента

Поле ID мы заполняем вручную: 1, 2, 3 и так далее. Это лишено смысловой нагрузки и неудобно — приходится постоянно помнить следующее значение. Логичнее поручить генерацию машине. Для этого у столбца существует свойство IDENTITY (автоинкремент). Включим его на примере следующей таблицы — Cinema (кинотеатры).

Открываем таблицу Cinema в режиме Design. Выделяем поле ID. В нижней панели свойств находим раздел Identity Specification, меняем значение (Is Identity) с No на Yes. Появляются два параметра:
Identity Increment — шаг приращения (оставляем 1).
Identity Seed — начальное значение (оставляем 1).

Теперь каждое новое значение будет автоматически увеличиваться на 1, начиная с 1. Среда предупреждает, что изменение приведёт к удалению и повторному созданию таблицы. Чтобы обойти блокировку таких сохранений, заходим в Tools → Options → Designers и снимаем флажок Prevent saving changes that require table re-creation. После этого можно применить изменения.

Заполнение таблицы Cinema

Снова выбираем Edit Top 200 Rows для таблицы Cinema. Поле ID стало серым и недоступным для редактирования — оно теперь генерируется автоматически. Вносим данные в остальные столбцы:
ID_City (ссылка на город): 1 (Москва), 1 (ещё один кинотеатр в Москве), 2 (Рязань), 3 (Тула).
Address и Name — адрес и название кинотеатров.
После заполнения закрываем окно — данные сохранены.

Заполнение таблицы Hall с помощью SQL-запроса INSERT

Следующая на очереди — таблица Hall (залы). Чтобы не пользоваться интерфейсом, напишем запрос. В Management Studio создаём New Query. Убеждаемся, что выбрана база данных Cinema (в выпадающем списке или командой USE Cinema).

Синтаксис вставки строк прост. Команда INSERT нечувствительна к регистру. Для вставки в конкретную базу данных можно указать полный путь: [Cinema].[dbo].[Hall]. Но если уже выполнена команда USE Cinema, достаточно написать INSERT INTO Hall. Далее идёт ключевое слово VALUES, после которого в круглых скобках перечисляются значения.

Таблица Hall содержит три поля, но ID теперь автоинкрементное. Вставляем только два — ID_Cinema (идентификатор кинотеатра) и HallName (название зала).

Пример вставки одного зала:

sql
INSERT INTO Hall (ID_Cinema, HallName)
VALUES (1, 'Пекин');

Нажимаем Execute — сообщение «1 row affected» подтверждает вставку. Проверка SELECT * FROM Hall показывает запись.

Вставка нескольких строк одним запросом

Перечисляем группы значений через запятую. Строковые литералы заключаются в одинарные кавычки. Если нужно указать юникодную строку, перед открывающей кавычкой ставят заглавную N. Пример для числового названия зала, которое должно храниться как текст:

sql
INSERT INTO Hall (ID_Cinema, HallName)
VALUES (1, 'Париж'),
(2, 'Лондон'),
(2, 'Прага'),
(3, '1'),
(3, '2'),
(3, '3');

Вторая цифра в последних строках — строка '1', '2', '3'.

Заполнение таблицы SeatCategory и особенности синтаксиса

Таблица SeatCategory (категории мест) содержит ID, CategoryName и Description (описание, допускает NULL). Сначала делаем ID автоинкрементным.

При вставке можно указать не все столбцы. Если поля пропускаются, перед VALUES необходимо перечислить заполняемые столбцы, имена которых и порядок следования должны соответствовать порядку значений. Например, вставляем только категорию «Стандарт», описание не указываем:

sql
INSERT INTO SeatCategory (CategoryName)
VALUES ('Стандарт');

Интерпретатор понимает, что единственное значение относится к столбцу CategoryName, а в Description записывается NULL.

Если же хотим задать и описание, перечисляем оба столбца:

sql
INSERT INTO SeatCategory (CategoryName, [Description])
VALUES ('VIP', 'Место повышенного комфорта');

Слово Description является зарезервированным (подсвечивается синим). Чтобы система восприняла его как имя столбца, а не ключевое слово, заключаем в квадратные скобки — [Description].

Когда в запросе перечислены все столбцы таблицы (как при вставке в Hall без списка полей), скобки с именами можно опустить. Это равносильно указанию «вставляю строку целиком».

Необходимость обновления данных

В конце работы возникает потребность добавить описание для категории «Стандарт». Для изменения существующих записей используется команда UPDATE, которую предстоит рассмотреть.

Краткие итоги

Начальный этап наполнения базы данных требует строгого соблюдения иерархии зависимостей, заложенных внешними ключами. Сперва заполняются таблицы-справочники, не ссылающиеся ни на кого, и только затем — дочерние сущности. Графический интерфейс Management Studio обеспечивает низкий порог входа и немедленную обратную связь, однако немасштабируем и порождает рутинные операции вроде ручного назначения очередного значения первичного ключа.

Именно ручной ввод идентификатора становится отправной точкой для осознания ценности автоматической генерации. Настройка IDENTITY решает проблему уникальности без вмешательства пользователя, повышая надёжность и устраняя когнитивную нагрузку. Показательно, что изменение структуры таблицы для включения автоинкремента требует в среде особого разрешения из-за потенциально разрушительного пересоздания объекта — административная предусмотрительность, которую следует учитывать в реальных проектах.

Переход от визуального редактирования к написанию запросов INSERT знаменует важный сдвиг в производительности труда. SQL позволяет вставлять не только единичные строки, но и целые наборы значений в одном обращении к серверу, что существенно сокращает накладные расходы. Гибкость синтаксиса при работе с неполными данными — явное указание списка столбцов — даёт возможность пропускать поля, разрешающие NULL, и делает код самодокументированным. Обработка зарезервированных слов через квадратные скобки демонстрирует механизм разрешения конфликтов имён, важный при поддержке унаследованных схем.

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

Заполнять базу данных Cinema нужно начиная с таблиц, не имеющих внешних ключей, — они ни от кого не зависят. В нашем случае это City. Через правый клик выбираем Edit Top 200 Rows, вносим города: Москва (ID=1), Рязань (2), Тула (3). Окно автоматически сохраняет каждое изменение.

Ручной ввод идентификаторов неудобен и лишён смысла. Значения первичного ключа должны генерироваться автоматически. Для этого в Management Studio предназначено свойство IDENTITY.

Настройка автоинкремента

Открываем таблицу Cinema в режиме Design. Выделяем столбец ID, в панели свойств находим Identity Specification и меняем (Is Identity) на Yes. Параметры:
Identity Increment = 1 (шаг),
Identity Seed = 1 (стартовое значение).

Среда предупреждает о пересоздании таблицы. Чтобы разрешить сохранение, идём в Tools → Options → Designers и снимаем флажок Prevent saving changes that require table re-creation. После этого автоинкремент активируется, поле ID становится серым и недоступным для редактирования. Теперь можно заполнять Cinema через тот же «Edit Top 200 Rows»: указываем ID_City, адрес и название кинотеатра.

Написание первого INSERT

Для заполнения таблицы залов (Hall) используем SQL. Создаём New Query, командой USE Cinema задаём целевую базу. Синтаксис вставки:

sql
INSERT INTO Hall (ID_Cinema, HallName)
VALUES (1, 'Пекин');

ID зала генерируется автоинкрементом. Строковые значения в T-SQL обрамляются одинарными кавычками. Если нужен юникод, перед строкой ставят N.

Вставка нескольких строк

Перечисляем группы значений через запятую:

sql
INSERT INTO Hall (ID_Cinema, HallName)
VALUES (1, 'Париж'),
(2, 'Лондон'),
(2, 'Прага'),
(3, '1'),
(3, '2'),
(3, '3');

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

Частичная вставка и зарезервированные слова

Таблица SeatCategory содержит необязательное поле Description. Делаем ID автоинкрементным. При вставке не всех столбцов необходимо перечислить заполняемые:

sql
INSERT INTO SeatCategory (CategoryName)
VALUES ('Стандарт');

Пропущенный Description получает NULL. Если нужно указать и описание, перечисляем оба столбца. Слово Description зарезервировано (подсвечено синим), поэтому его заключают в квадратные скобки:

sql
INSERT INTO SeatCategory (CategoryName, [Description])
VALUES ('VIP', 'Место повышенного комфорта');

Когда в запросе опущен список столбцов, ожидаются значения для всех полей таблицы в порядке их объявления.

Дальнейшие действия
После вставки категорий может потребоваться изменить существующие записи — например, добавить описание для «Стандарт». Это делается командой UPDATE, которую предстоит изучить.

Выводы

1. Заполнение начинается с родительских таблиц, не имеющих внешних ключей, во избежание нарушений ссылочной целостности.
2. Ручное присвоение значений первичного ключа трудоёмко и повышает риск дублирования, поэтому предпочтительнее автоматическая генерация.
3. Свойство IDENTITY (автоинкремент) позволяет серверу самостоятельно назначать уникальные числовые идентификаторы.
4. Перед включением IDENTITY, требующим пересоздания таблицы, необходимо снять блокировку в настройках Designers.
5. Интерфейс «Edit Top 200 Rows» удобен для быстрого прототипирования, но не заменяет полноценные запросы для массовых операций.
6. Команда INSERT INTO с VALUES используется для построчной или множественной вставки данных в таблицу.
7. Строковые значения в T-SQL обрамляются одинарными кавычками; для юникодных строк добавляется префикс N.
8. При пропуске необязательных полей требуется явно перечислить заполняемые столбцы перед конструкцией VALUES.
9. Совпадения имён объектов с зарезервированными словами языка разрешаются заключением имени в квадратные скобки.
10. Команда USE задаёт контекст базы данных, избавляя от необходимости указывать полный путь к объектам в каждом обращении.
11. Один запрос INSERT способен добавить несколько строк, если перечислить группы значений через запятую.
12. Для изменения уже существующих записей применяется команда UPDATE, рассмотрение которой продолжает тему манипуляции данными.

Вопросы для самопроверки

1. Почему таблицы следует заполнять, начиная с наиболее независимых (родительских)?
2. Какое свойство столбца в Management Studio включает автоматическую генерацию значений, и как его активировать?
3. Как снять ограничение среды, не позволяющее сохранить изменение структуры таблицы, требующее её пересоздания?
4. Чем отличается вставка данных через интерфейс «Edit Top 200 Rows» от использования SQL-запроса INSERT?
5. Напишите полный синтаксис запроса, добавляющего одну строку в таблицу Hall с явным указанием столбцов.
6. Как одним запросом INSERT вставить три разные строки с разными значениями?
7. В каком случае перед VALUES необходимо перечислить имена столбцов, и каков должен быть порядок значений?
8. Почему слово Description в запросе может быть подсвечено синим, и как корректно сослаться на столбец с таким именем?
9. Какая команда задаёт контекст базы данных, избавляя от необходимости писать полный путь к таблице?
10. Как указать, что строковое значение должно интерпретироваться как юникод?
11. Что произойдёт, если при вставке опустить столбец, для которого не разрешён NULL и не задано значение по умолчанию?
12. Для каких целей служит команда UPDATE, упомянутая в конце лекции?
Вернуться к учебному плану