SQL инструкции. Вертикальное объединение идентичных таблиц. UNION

Итак, представим, что у нас есть 2 филиала институтов, и нам нужно объединить данные по студентам в 2 таблицы. Проблема может быть только в главных ключах, то есть, если в одной таблице нумерация идет 1,2,3… и  в другой… 1,2,3…, то, после соединения, если в процессе не будет ошибок, результирующая таблица будет с ключами 1,2,3,1,2,3… и, нарушится целостность.

Таким образом, чтобы выйти из этой ситуации, можно изначально проектировать таблицы с различными ключами, например, в одной таблице 1,3,5…. В другой 2,4,6…. И тогда, при объединении, мы избавимся от такой проблемы….

На данный момент, к сожалению не нашёл как сделать такой “финт” в программе workbench, потому что в разделе Options, там есть только поле Autoincrement, возле которого написано Initial Autoincrement value for the table. То есть, насколько я понимаю, это стартовое значение, а вот где настраивать шаг автоинкремента непонятно…

1

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

Либо другой путь – создадим внутри нашей первой модели дубль таблицы Students, под именем Students2, и объединим эти таблицы. Надо понимать, что для объединения таблиц – у нас должно совпадать число столбцов и тип данных… Поэтому для начала объединим идентичные таблицы, заодно посмотрим ситуацию с ключами, поскольку в той и другой таблице – ключи идентичные…

Итак, Copy “Students” Paste “Students”, и у нас возник дубль таблицы, но, если мы зайдем на вкладку Inserts этой таблицы, тогда выясним, что она пуста… То есть, скопировались только поля таблицы, но не записи…

2

Тут можно поступить разными способами – нажать правой кнопкой мыши на “Students” и выбрать copy inserts to clipboard, при этом в буфер скопируется скрипт, который потом можно будет выполнить. Но, поскольку, мы учимся, пойдем более простым путём – забьем “ручками” новые значения, таким образом, чтобы при слиянии их потом можно было отличить.

3_1

Итак, я забил произвольные данные и проставил ключ от 1 до 5 с шагом в 1, то есть пересечение с таблицей Students есть. Посмотрим как отреагирует система на слияние таблиц. Чтобы отличать эти записи, среди всех после объединения, я добавил слово COPY_ перед именем. Итак, выполним извлечем скрипт и выполним его на сервере, для того, чтобы добавить новую таблицу в физическую базу данных.

В процессе выполнения скрипта, у меня появилась ошибка errno 121, для того, чтобы временно избавиться от этой ошибки – я удалил описание внешнего ключа у таблицы Students2 и скрипт выполнился. На данном этапе важно посмотреть как объединяются таблицы, со связями между таблицами будем работать чуть позже.

Итак, для того, чтобы проверить наличие таблицы Students2, создадим в Delphi новый проект, на форму поместим SQLConnection, SimpleDataSet, DataSource…

Во View Data Explorer создайте новое подключение, либо отредактируйте старое таким образом, чтобы в клиенте Delphi вы могли видеть таблицу Students2 (о том, как настраивать такое подключение можно прочитать в статье).

4

 

Проверить это очень просто – в компоненте Simple Data Set, в объектном инспекторе – выберите в свойстве CommandType – ctTable. А в CommandText – таблицу Students2, если всё правильно сделали – она будет отображаться в выпадающем списке CommandText.

Теперь нам нужно на форме разместить 2 таблицы – Students и Students2 и где-то отображать 3-ю – результирующую таблицу… Я немного усовершенствовал форму и сделал таким образом…

5

 

А после компиляции это выглядит так…

6

 

В клиенте “зашит” единственный запрос Select*from students union Select*from students_copy

После нажатия на кнопку ВЫПОЛНИТЬ получаем результирующую таблицу

7

 

Обратите внимание на ключ… Система никоим образом не проконтроллировала, чтобы ключ в результирующей таблице был уникальным. После 10-й записи, у нас все начинается с 1-й записи, а это грозит потенциальными проблемами, потому что потеряна уникальность.

То есть, если бы мы, например пытались сохранить полученную таблицу в базу данных, то нарушили бы уникальность записей. То есть, если такое объединение необходимо – нужно ещё при проектировании БД позаботиться о том, чтобы ключи никогда не персекались, один из способов – делить на четные и нечетные ключи (подробнее в самом начале статьи).

Повторяющиеся записи

 Итак, повторяющиеся записи по умолчанию исключаются, но если их нужно показать, напишите UNION ALL. Проведем, эксперимент. Внесем повторяющиеся строки, с помощью программы Workbench

9

Произведем SQL запрос Select*from students union Select*from students_copy

Получим результат без дублирующей строки

10

Теперь добавим в операторе слово ALL после UNION

 Select*from students union all Select*from students_copy

Обратите внимание, теперь результат с дублирующей строкой…

11

На этом данный пост про UNION заканчиваю.


[block id=”mysql-first-steps”]

This entry was posted in Delphi, SQL инструкции, Без рубрики, Начальный уровень. Bookmark the permalink.