что такое dml и ddl
Что такое DDL, DML, DCL и TCL в языке SQL
Приветствую всех посетителей сайта Info-Comp.ru! В этом материале я расскажу Вам о том, что такое DDL, DML, DCL и TCL в языке SQL. Если Вы не знаете, что означают эти непонятные наборы букв и при этом работаете с языком SQL, то Вам обязательно необходимо прочитать данный материал.
Для начала давайте вспомним, что такое SQL, и для чего он нужен.
SQL – Structured Query Language
Structured Query Language (SQL) — язык структурированных запросов, с помощью него пишутся специальные запросы (SQL инструкции) к базе данных с целью получения этих данных из базы и для манипулирования этими данными.
Иными словами, язык SQL нужен для работы с базами данных, более подробно о языке SQL можете почитать в отдельной моей статье – Что такое SQL. Назначение и основа.
С точки зрения реализации язык SQL представляет собой набор операторов, которые делятся на определенные группы и у каждой группы есть свое назначение. В сокращенном виде эти группы называются DDL, DML, DCL и TCL.
Таким образом, эти непонятные буквы представляют собой аббревиатуру
названий групп операторов языка SQL.
DDL – Data Definition Language
Data Definition Language (DDL) – это группа операторов определения данных. Другими словами, с помощью операторов, входящих в эту группы, мы определяем структуру базы данных и работаем с объектами этой базы, т.е. создаем, изменяем и удаляем их.
В эту группу входят следующие операторы:
DML – Data Manipulation Language
Data Manipulation Language (DML) – это группа операторов для манипуляции данными. С помощью этих операторов мы можем добавлять, изменять, удалять и выгружать данные из базы, т.е. манипулировать ими.
В эту группу входят самые распространённые операторы языка SQL:
DCL – Data Control Language
Data Control Language (DCL) – группа операторов определения доступа к данным. Иными словами, это операторы для управления разрешениями, с помощью них мы можем разрешать или запрещать выполнение определенных операций над объектами базы данных.
TCL – Transaction Control Language
Transaction Control Language (TCL) – группа операторов для управления транзакциями. Транзакция – это команда или блок команд (инструкций), которые успешно завершаются как единое целое, при этом в базе данных все внесенные изменения фиксируются на постоянной основе или отменяются, т.е. все изменения, внесенные любой командой, входящей в транзакцию, будут отменены.
Группа операторов TCL предназначена как раз для реализации и управления транзакциями. Сюда можно отнести:
Заметка! Всем тем, кто только начинает свое знакомство с языком SQL, рекомендую прочитать книгу «SQL код» – это самоучитель по языку SQL, которую написал я, и в которой я подробно, и в то же время простым языком, рассказываю о языке SQL.
На сегодня это все, надеюсь, материал был Вам полезен, удачи!
DDL против DML
Разница между DDL и DML
В системе управления реляционными базами данных (RDBMS) огромное количество данных хранится в таблицах. Эти таблицы представляют собой набор связанных данных, где данные хранятся в строках и столбцах. Такой способ хранения данных позволяет эффективно использовать его при возникновении требования. Очень важно получить доступ к данным из этих таблиц, чтобы использовать их для бизнес-требований, а также, когда необходимо изменить существующие данные, содержащиеся в базе данных. Чтобы получить данные или манипулировать ими, нам нужен язык структурированных запросов (SQL). SQL поставляется со стандартными командами для взаимодействия с RDBMS. Язык определения данных (DDL) используется для определения схемы базы данных, а язык манипулирования данными (DML) используется для манипулирования данными, которые уже существуют в базе данных. В этой теме мы собираемся узнать о DDL против DM. В этой теме мы собираемся узнать о DDL против DML.
Сравнение лицом к лицу между DDL и DML (инфографика)
Ниже приведены основные различия между DDL и DML.
Ключевые различия между DDL и DML
Основные различия между DDL и DML, как показано ниже:
DDL и DML Сравнительная таблица
Давайте обсудим 6 основных различий между DDL и DML
DDL (язык определения данных) | DML (язык манипулирования данными) | |
Язык определения данных используется для определения схемы базы данных. Он касается того, как данные хранятся в базе данных. | Data Manipulation Language используется для манипулирования, т.е. извлечения, обновления и удаления данных в базе данных. | |
Команды DDL, которые используются в SQL: CREATE, DROP, ALTER, TRUNCATE и т. Д. | Команды DML, используемые в SQL: INSERT, UPDATE, DELETE, SELECT и т. Д. | |
Команда CREATE используется для создания таблицы или представления таблицы. Его также можно использовать для создания других объектов базы данных, таких как индекс, хранимая процедура, триггеры и т. Д. Синтаксис для создания таблицы такой: CREATE TABLE table_name ( COLUMN_1 тип данных PRIMARY KEY, COLUMN_2 тип данных, COLUMN_3 тип данных, ); | Команда INSERT используется для вставки данных в таблицу. Синтаксис для вставки данных в таблицу такой: Синтаксис использования команды ALTER следующий: ALTER TABLE table_name RENAME TO table_name_new; | Команда UPDATE используется для обновления существующих данных в таблице. Синтаксис использования команды UPDATE такой: ОБНОВЛЕНИЕ table_name SET столбец1 = значение1, столбец2 = значение2, … столбецN = значениеN ГДЕ (условие); |
Команда DROP используется для удаления таблицы или представления таблицы или других объектов базы данных. Команда DROP удалит данные, а также определение таблицы. Так что эту команду следует использовать осторожно. Синтаксис для удаления базы данных следующий: DROP DATABASE database_name; Синтаксис для удаления таблицы следующий: DROP TABLE table_name; | Команда DELETE используется для удаления записей из таблицы. Синтаксис для использования команды DELETE следующий: DELETE FROM table_name; В приведенном выше синтаксисе все строки таблицы будут удалены, но структура таблицы останется. Но если мы используем команду DELETE вместе с предложением WHERE, будут удалены только определенные записи в соответствии с предложением WHERE. Синтаксис команды DELETE вместе с предложением WHERE такой: DELETE FROM table_name WHERE (условие); | |
Команда TRUNCATE используется для удаления данных из таблицы, но структура таблицы остается неизменной. Таким образом, с помощью этой команды удаляются только данные, а не таблица. Синтаксис команды TRUNCATE такой: TRUNCATE TABLE table_name; | Команда SELECT используется для извлечения данных из таблиц в базе данных. Синтаксис для использования команды SELECT следующий: SELECT column1, column2… columnN FROM table_name; Приведенный выше оператор выбирает столбцы, указанные в операторе select. Но когда мы хотим выбрать все столбцы таблицы, нам нужно использовать «*» в операторе выбора. Синтаксис для выбора всех столбцов таблицы следующий: SELECT * FROM table_name; |
Вывод
SQL обеспечивает гибкость определения схемы, а затем ее изменения в соответствии с требованиями в базе данных с использованием языков определения данных и языка манипулирования данными. Благодаря использованию простых операторов DDL разработчику становится проще определять схему базы данных, структуру таблицы для больших объемов данных. Также с использованием операторов DML мы можем манипулировать данными, то есть извлекать данные, изменять существующие данные и т. Д. Всякий раз, когда возникает необходимость. При работе с различными командами DDL и DML необходимо учитывать некоторые важные моменты. Разработчик или разработчик программного обеспечения должен получить полное представление о работе различных операций DDL и DML, поскольку они играют жизненно важную роль в создании эффективной базы данных в соответствии с требованиями бизнеса.
Рекомендуемые статьи
DDL против DML: большая разница между DDL и DML
Главное меню » Базы данных » DDL против DML: большая разница между DDL и DML
Теперь сравним DML и DDL. DML – это реляционный и объектно-ориентированный язык, который обычно используется для описания таблиц и связанных сущностей. С другой стороны, DDL – это уровень абстракции программного обеспечения поверх языка управления данными (DML). Синтаксис DML очень похож на VSM и SQL. Одна вещь, которую разделяют DML и DDL, – это возможность определять ключи сущностей, которые можно повторно использовать в остальной части оператора DML.
DDL против DML: основные различия
Между DML и DDL есть несколько основных различий. Во-первых, DDL более гибок, чем DML. Например, он позволяет разработчику создавать более сложные языки определения данных, такие как схемы данных, логические схемы, схемы отношений, определяемые пользователем роли и т. д. В DML можно использовать только общие объекты. С другой стороны, DML более гибок, когда дело касается работы со сложными структурами базы данных.
Еще одно важное отличие состоит в том, что DML более читабелен, чем DDL. В случае какой-либо неоднозначности в данных, которыми вы хотите манипулировать, DML позволяет вам сохранить результат в корневой таблице и использовать команду DML для доступа к вложенным таблицам или подчиненным отношениям корневой таблицы. С другой стороны, DDL не позволяет вам этого делать.
Еще одно отличие, которое делает DML и DDL более читаемыми, заключается в том, что операторы DML являются более общими и удобочитаемыми. DML очень удобен для чтения, поскольку поддерживает различные языки обработки данных и может быть написан более лаконично. DML также является более общим, поскольку он может обозначать любую сущность или свойство. Концепция сущностей в DML очень похожа на концепции логических схем в других языках программирования. Так, например, когда вы пишете оператор DML, он всегда будет создавать правильную сущность или свойство, задуманное разработчиком.
Одно из основных различий между DDL и DML в управлении базами данных состоит в том, что операторы DML позволяют разработчикам создавать повторно используемые модули, которые могут выполняться параллельно, не требуя знаний об администрировании баз данных. С другой стороны, приложение, использующее SQL-сервер, обычно имеет дело с сохранением сущностей. При создании транзакции SQL нет гарантии, что операторы, написанные для команд сохранения сущности, будут согласованы между операторами, написанными для простых пользовательских запросов. Следовательно, разработчикам часто необходимо применять процедуры исправления, которые обеспечивали бы согласованность логики сохранения сущностей.
Еще одно большое различие между DML и DDL заключается в том, что DML является более гибким языком запросов, чем базы данных SQL. Если вы посмотрите на синтаксис SQL, вы поймете, что оператор DML состоит из двух или более предложений по сравнению с оператором SQL, который содержит только одно предложение. Это делает DML намного более гибким, чем традиционные системы РСУБД. Отсутствие единого языка определений делает DML более гибким и позволяет разработчикам писать более общий код. С другой стороны, базы данных SQL упрощают сопоставление имен сущностей с фактическими данными в таблице SQL.
Еще одно большое различие между DML и DDL в управлении базами данных состоит в том, что DML позволяет разработчику определять отношения между сущностями и объединяемыми таблицами. В случае традиционных систем РСУБД разработчик должен либо создать общую связь, либо использовать хранимые процедуры для выполнения задачи. Нет лучшего способа выразить тот факт, что между таблицами и сущностями существует связь.
DDL против DML: таблица сравнения
DDL | DML |
DDL (язык определения данных) помогает указать структуру или схему базы данных. | DML (язык манипулирования данными) позволяет обрабатывать данные, хранящиеся в базе данных. |
Команда DDL в основном используется для создания схемы базы данных. | Команда DML может использоваться для заполнения и управления базой данных |
Это не классифицируется дальше. | DML подразделяется на DML процедурного и непроцедурного характера. |
CREATE, DROP, ALTER, TRUNCATE, COMMENT, RENAME и т.д. | INSERT, DELETE, UPDATE, MERGE, CALL и т. д. |
DDL определяет столбец таблицы. | DML добавляет или обновляет строку таблицы |
Операторы DDL влияют на всю таблицу. | DML влияет на одну или несколько строк в соответствии с конкретными требованиями |
Вы не можете откатить инструкцию SQL | Используя DML, мы можем откатить инструкцию SQL |
DDL является декларативным | DML обязательно |
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть третья
Предыдущие части
О чем будет рассказано в этой части
Выражение CASE – условный оператор языка SQL
Данный оператор позволяет осуществить проверку условий и возвратить в зависимости от выполнения того или иного условия тот или иной результат.
Оператор CASE имеет 2 формы:
Первая форма: | Вторая форма: |
---|---|
CASE WHEN условие_1 THEN возвращаемое_значение_1 … WHEN условие_N THEN возвращаемое_значение_N [ELSE возвращаемое_значение] END | CASE проверяемое_значение WHEN сравниваемое_значение_1 THEN возвращаемое_значение_1 … WHEN сравниваемое_значение_N THEN возвращаемое_значение_N [ELSE возвращаемое_значение] END |
В качестве значений здесь могут выступать и выражения.
Разберем на примере первую форму CASE:
ID | Name | Salary | SalaryTypeWithELSE | SalaryTypeWithoutELSE | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1000 | Иванов И.И. | 5000 | ЗП >= 3000 | ЗП >= 3000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1001 | Петров П.П. | 1500 | ЗП 3000». Т.е. здесь в первую очередь происходит группировка и вычисляются данные по всем отделам: А уже к этим данным применяется условие указанно в блоке HAVING: В HAVING-условии так же можно строить сложные условия используя операторы AND, OR и NOT: Как можно здесь заметить агрегатная функция (см. «COUNT(*)») может быть указана только в блоке HAVING. Соответственно мы можем отобразить только номер отдела, подпадающего под HAVING-условие: Пример использования HAVING-условия по полю включенного в GROUP BY: Это только пример, т.к. в данном случае проверку логичнее было бы сделать через WHERE-условие: Т.е. сначала отфильтровать сотрудников по отделу 3, и только потом сделать расчет.
Думаю, на этом рассказ о HAVING-условиях можно окончить. Подведем итогиСведем данные полученные во второй и третьей части и рассмотрим конкретное месторасположение каждой изученной нами конструкции и укажем порядок их выполнения:
Конечно же, вы так же можете применить к сгруппированным данным предложения DISTINCT и TOP, изученные во второй части. Эти предложения в данном случае применятся к окончательному результату:
Как получились данные результаты проанализируйте самостоятельно. ЗаключениеОсновная цель которую я ставил в данной части – раскрыть для вас суть агрегатных функций и группировок. Если базовая конструкция позволяла нам получить необходимые детальные данные, то применение агрегатных функций и группировок к этим детальным данным, дало нам возможность получить по ним сводные данные. Так что, как видите здесь все важно, т.к. одно опирается на другое – без знания базовой конструкции мы не сможем, например, правильно отобрать данные, по которым нам нужно просчитать итоги. Здесь я намеренно стараюсь показывать только основы, чтобы сосредоточить внимание начинающих на самых главных конструкциях и не перегружать их лишней информацией. Твердое понимание основных конструкций (о которых я еще продолжу рассказ в последующих частях) даст вам возможность решить практически любую задачу по выборке данных из РБД. Основные конструкции оператора SELECT применимы в таком же виде практически во всех СУБД (отличия в основном состоят в деталях, например, в реализации функций – для работы со строками, временем, и т.д.). Если вы делаете первые шаги в SQL, то сосредоточьтесь в первую очередь, именно на изучении базовых конструкций, т.к. владея базой, все остальное вам понять будет гораздо легче, и к тому же самостоятельно. Вам в первую очередь, как бы нужно объемно понять возможности языка SQL, т.е. какого рода операции он вообще позволяет совершить над данными. Донести до начинающих информацию в объемном виде – это еще одна из причин, почему я буду показывать только самые главные (железные) конструкции. Удачи вам в изучении и понимании языка SQL. Что такое dml и ddlStructured Query Language (SQL) — язык структурированных запросов, с помощью него пишутся специальные запросы (SQL инструкции) к базе данных с целью получения этих данных из базы и для манипулирования этими данными. С точки зрения реализации язык SQL представляет собой набор операторов, которые делятся на определенные группы и у каждой группы есть свое назначение. В сокращенном виде эти группы называются DDL, DML, DCL и TCL. DDL – Data Definition Language Data Definition Language (DDL) – это группа операторов определения данных. Другими словами, с помощью операторов, входящих в эту группы, мы определяем структуру базы данных и работаем с объектами этой базы, т.е. создаем, изменяем и удаляем их. В эту группу входят следующие операторы: DML – Data Manipulation Language Data Manipulation Language (DML) – это группа операторов для манипуляции данными. С помощью этих операторов мы можем добавлять, изменять, удалять и выгружать данные из базы, т.е. манипулировать ими. В эту группу входят самые распространённые операторы языка SQL: DCL – Data Control Language Data Control Language (DCL) – группа операторов определения доступа к данным. Иными словами, это операторы для управления разрешениями, с помощью них мы можем разрешать или запрещать выполнение определенных операций над объектами базы данных. TCL – Transaction Control Language Transaction Control Language (TCL) – группа операторов для управления транзакциями. Транзакция – это команда или блок команд (инструкций), которые успешно завершаются как единое целое, при этом в базе данных все внесенные изменения фиксируются на постоянной основе или отменяются, т.е. все изменения, внесенные любой командой, входящей в транзакцию, будут отменены. Базовый синтаксис SQL команды SELECT Одна из основных функций SQL — получение данных из СУБД. Для построения всевозможных запросов к базе данных используется оператор SELECT. Он позволяет выполнять сложные проверки и обработку данных. Общая структура запроса В описанной структуре запроса необязательные параметры указаны в квадратных скобках. Псевдонимы используются для представления столбцов или таблиц с именем отличным от оригинального. Это может быть полезно для улучшения читабельности имён и создания более короткого наименования столбца или таблицы. Например, если в вашей таблице есть столбец good_type_id, вы можете переименовать его просто в id, для того, чтобы сделать его более коротким и удобным в использовании в будущем. Для создания псевдонимов используется оператор AS: Вы можете выводить любые строки и числа вместо столбцов: Для того, чтобы вывести все данные из таблицы Company, вы можете использовать символ «*», который буквально означает «все столбцы»: Вы можете вывести любой столбец, определённый в таблице, например, town_to из таблицы Trip: Также вы можете вывести несколько столбцов. Для этого их нужно перечислить через запятую: Иногда возникают ситуации, в которых нужно получить только уникальные записи. Для этого вы можете использовать DISTINCT. Например, выведем список городов без повторений, в которые летали самолеты: Эта конструкция используется для формирования словарей, примеры рассмотрим в главе про команду INSERT Условный оператор WHERE Ситуация, когда требуется сделать выборку по определенному условию, встречается очень часто. Для этого в операторе SELECT существует параметр WHERE, после которого следует условие для ограничения строк. Если запись удовлетворяет этому условию, то попадает в результат, иначе отбрасывается. Общая структура запроса с оператором WHERE В описанной структуре запроса необязательные параметры указаны в квадратных скобках. В условном операторе применяются операторы сравнения, специальные и логические операторы. Операторы сравнения служат для сравнения 2 выражений, их результатом может являться ИСТИНА (1), ЛОЖЬ (0) и NULL.
IS [NOT] NULL — позволяет узнать равно ли проверяемое значение NULL. Для примера выведем всех членов семьи, у которых статус в семье не равен NULL: [NOT] BETWEEN min AND max — позволяет узнать расположено ли проверяемое значение столбца в интервале между min и max. Выведем все данные о покупках с ценой от 100 до 500 рублей из таблицы Payments: [NOT] IN — позволяет узнать входит ли проверяемое значение столбца в список определённых значений. Выведем имена членов семьи, чей статус равен «father» или «mother»: [NOT] LIKE шаблон [ESCAPE символ] — позволяет узнать соответствует ли строка определённому шаблону. Например, выведем всех людей с фамилией «Quincey»: В шаблоне разрешается использовать два трафаретных символа: ESCAPE-символ используется для экранирования трафаретных символов. В случае если вам нужно найти строки, содержащие проценты (а процент — это зарезервированный символ), вы можете использовать ESCAPE-символ. Например, вы хотите получить идентификаторы задач, прогресс которых равен 3%: Если бы мы не экранировали трафаретный символ, то в выборку попало бы всё, что начинается на 3. Логические операторы необходимы для связывания нескольких условий ограничения строк. Выведем все полёты, которые были совершены на самолёте «Boeing», но, при этом, вылет был не из Лондона: Выборка сводных данных (из двух и более таблиц) При формировании сводной выборки данные беруться из нескольких таблиц. В операторе FROM исходные таблицы перечисляются через запятую. Также им могут быть присвоены алиасы. Синтаксис запроса выглядит следующийм образом: При выборке сводных таблиц нужно учитывать, что исходные таблицы перемножаются. Т.е. если на входе у нас были таблицы:
То при простом запросе без условий Получим примерно следующее:
Чтобы выбрать уникальные значения, нам нужно использовать оператор WHERE для связи этих таблиц Вложенные SQL запросы\ Вложенный запрос — это запрос на выборку, который используется внутри инструкции SELECT, INSERT, UPDATE или DELETE или внутри другого вложенного запроса. Подзапрос может быть использован везде, где разрешены выражения. Пример структуры вложенного запроса Здесь, SELECT поля_таблиц FROM список_таблиц WHERE конкретное_поле IN (. ) — внешний запрос, а SELECT поле_таблицы FROM таблица — вложенный (внутренний) запрос. Каждый вложенный запрос, в свою очередь, может содержать один или несколько вложенных запросов. Количество вложенных запросов в инструкции не ограничено. Подзапрос может содержать все стандартные инструкции, разрешённые для использования в обычном SQL-запросе: DISTINCT, GROUP BY, LIMIT, ORDER BY, объединения таблиц, запросов и т.д. Подзапрос может возвращать скаляр (одно значение), одну строку, один столбец или таблицу (одну или несколько строк из одного или нескольких столбцов). Они называются скалярными, столбцовыми, строковыми и табличными подзапросами. Подзапрос как скалярный операнд Скалярный подзапрос — запрос, возвращающий единственное скалярное значение (строку, число и т.д.). Следующий простейший запрос демонстрирует вывод единственного значения (названия компании). В таком виде он не имеет большого смысла, однако ваши запросы могут быть намного сложнее. Таким же образом можно использовать скалярные подзапросы для фильтрации строк с помощью WHERE, используя операторы сравнения. С помощью данного запроса возможно получить самого младшего члена семьи. Здесь используется подзапрос для получения максимальной даты рождения, которая затем используется для фильтрации строк. Подзапросы с ANY, IN, ALL ALL — ключевое слово, которое должно следовать за операцией сравнения, возвращающее TRUE, если все значения столбца подзапроса удовлетворяет обозначенному условию. IN — ключевое слово, являющееся псевдонимом ключевому слову ANY с оператором сравнения = (эквивалентность), либо <> ALL для NOT IN. Например, следующие запросы равнозначны: Строковый подзапрос — это подзапрос, возвращающий единственную строку с более чем одной колонкой. Например, следующий запрос получает в подзапросе единственную строку, после чего по порядку попарно сравнивает полученные значения со значениями во внешнем запросе. Данную конструкцию удобно использовать для замены логических операторов. Так, следующие два запроса полностью эквивалентны: Связанным подзапросом является подзапрос, который содержит ссылку на таблицу, которая была объявлена во внешнем запросе. Здесь вложенный запрос ссылается на внешюю таблицу «таблица_1»: Подзапросы как производные таблицы Производная таблица — выражение, которое генерирует временную таблицу в предложении FROM, которая работает так же, как и обычные таблицы, которые вы указываете через запятую. Так выглядит общий синтаксис запроса с использованием производных таблиц: Обратите внимание на то, что для производной таблицы обязательно должен указываться её псевдоним, для того, чтобы имелась возможность обратиться к ней в других частях запроса. Обработка вложенных запросов Вложенные подзапросы обрабатываются «снизу вверх». То есть сначала обрабатывается вложенный запрос самого нижнего уровня. Далее значения, полученные по результату его выполнения, передаются и используются при реализации подзапроса более высокого уровня и т.д. Добавление данных, оператор INSERT Для добавления новых записей в таблицу предназначен оператор INSERT. Общая структура запроса с оператором INSERT В описанной структуре запроса необязательные параметры указаны в квадратных скобках. Вертикальной чертой обозначен альтернативный синтаксис. Значения можно вставлять перечислением с помощью слова values, перечислив их в круглых скобках через запятую или c помощью оператора select. Таким образом, добавить новые записей можно следующими способами: Первичный ключ при добавлении новой записи Следует помнить, что первичный ключ таблицы является уникальным значением и добавление уже существующего значения приведет к ошибке. При добавлении новой записи с уникальными индексами выбор такого уникального значения может оказаться непростой задачей. Решением может быть дополнительный запрос, направленный на выявление максимального значения первичного ключа для генерации нового уникального значения. В SQL введен механизм его автоматической генерации. Для этого достаточно снабдить первичный ключ good_id атрибутом AUTO_INCREMENT. Тогда при создании новой записи в качестве значения good_id достаточно передать NULL или 0 — поле автоматически получит значение, равное максимальному значению столбца good_id, плюс единица. Теперь, зная синткасис команд INSERT и SELECT, можем разобраться как создать из исходного набора данных словари и загрузить данные в БД с учетом внешних ключей Допустим есть список агентов (данные полученные от заказчика в виде CSV-файла), у которых есть поля название, тип и т.д. (далее по тексту я её называю таблица импорта) В структуре БД поле «тип агента» создано как внешний ключ на таблицу типов Пишем инструкцию SELECT, которая выбирает уникальные записи из таблицы импорта: Этот запрос можно выполнить отдельно, чтобы проверить что получится После отладки запроса SELECT перед ним допишем запрос INSERT: Если в таблице есть обязательные поля, а нем неоткуда взять для них данные, то мы можем в SELECT вставить фиксированные значения (в примере пустая строка): Заполнение основной таблицы Тоже сначала пишем SELECT запрос, чтобы проверить те ли данные получаются напоминаю, что порядок и количество выбираемых и вставляемых полей должны быть одинаковыми в поле AgentTypeID мы должны вставить ID соответсвующей записи из таблицы AgentType, поэтому выборка у нас из двух таблиц и чтобы не писать перед каждым полем полные названия таблиц мы присваиваем им алиасы Т.е. мы выбираем перечисленные поля из таблицы agents_import и добавляем к ним ID агента у которого совпадает название. Если же мы не укажем условие WHERE, то выберутся, к примеру, 100 * 10 = 1000 записей (каждый агент будет в каждой категории). Поэтому важно, чтобы условие WHERE выбирало уникальные значения. Естественно, количество внешних ключей в таблице может быть больше одного, в таком случае в секции FROM перечисляем все используемые словари и в секции WHERE перечисляем условия для всех таблиц объединив их логическим выражением AND Написав и проверив работу выборки (она должна возвращать чтолько же записей, сколько в таблице импорта) дописываем команду вставки данных: Необходимо во-первых, восстановить структуру БД из скрипта, во-вторых, импортировать исходные данные в Excel, в-третьих исправить данные (смотрите на структуру таблиц в БД, где-то надо явно указать тип данных, где-то вырезать лишние данные. ) и в-четвёртых загрузить исправленные данные в БД (сначала просто импорт во временные таблицы, потом разнести SQL-запросами по нужным таблицам)
|