Sql создать таблицу: MS SQL Server и T-SQL

НОУ ИНТУИТ | Лекция | Создание базы данных и проектирование таблиц

Аннотация: Определяется процесс создания базы данных. Описываются операторы
создания, изменения базы данных. Рассматривается возможность указания
имени файла или нескольких файлов для хранения данных, размеров и
местоположения файлов. Анализируются операторы создания, изменения,
удаления пользовательских таблиц. Приводится описание параметров для
объявления столбцов таблицы. Дается понятие и характеристика
индексов. Рассматриваются операторы создания и изменения индексов.
Определяется роль индексов в повышении эффективности выполнения
операторов SQL.

Ключевые слова: база данных, таблица, каталог, схема, журнал транзакций, индекс, вторичный файл, первичный файл, логическое имя файла, физическое имя файла, размер шага, создание таблицы, строка, столбец, имя таблицы, изменение таблицы, тип данных столбца, удаление таблицы, создание индекса, ключ индекса, уникальный индекс, кластерный индекс, некластерный индекс, удаление индекса

База данных

Создание базы данных

intuit.ru/2010/edi»>В различных СУБД процедура создания баз данных обычно закрепляется
только за администратором баз данных. В однопользовательских системах
принимаемая по умолчанию база данных может быть сформирована
непосредственно в процессе установки и настройки самой СУБД. Стандарт
SQL не определяет, как должны создаваться базы данных, поэтому в
каждом из диалектов языка SQL обычно используется свой подход. В
соответствии со стандартом SQL, таблицы и другие объекты базы данных
существуют в некоторой среде. Помимо всего прочего, каждая среда
состоит из одного или более каталогов, а каждый каталог – из набора схем. Схема представляет собой поименованную коллекцию объектов базы
данных, некоторым образом связанных друг с другом (все объекты в базе
данных должны быть описаны в той или иной схеме ). Объектами схемы
могут быть таблицы, представления, домены, утверждения,
сопоставления, толкования и наборы символов. Все они имеют одного и
того же владельца и множество общих значений, принимаемых по
умолчанию.

Стандарт SQL оставляет за разработчиками СУБД право выбора
конкретного механизма создания и уничтожения каталогов, однако
механизм создания и удаления схем регламентируется посредством
операторов CREATE SCHEMA и DROP SCHEMA. В стандарте также указано,
что в рамках оператора создания схемы должна существовать возможность
определения диапазона привилегий, доступных пользователям создаваемой схемы. Однако конкретные способы определения подобных привилегий в
разных СУБД различаются.

В настоящее время операторы CREATE SCHEMA и DROP SCHEMA реализованы в
очень немногих СУБД. В других реализациях, например, в СУБД MS SQL
Server, используется оператор CREATE DATABASE.

Создание базы данных в среде MS SQL Server

Процесс создания базы данных в системе SQL-сервера состоит из двух
этапов: сначала организуется сама база данных, а затем принадлежащий
ей журнал транзакций. Информация размещается в соответствующих
файлах, имеющих расширения *.mdf (для базы данных ) и *.ldf. (для журнала транзакций ). В файле базы данных записываются сведения об
основных объектах ( таблицах, индексах, представлениях и т.д.), а в файле журнала транзакций – о процессе работы с транзакциями (контроль
целостности данных, состояния базы данных до и после выполнения
транзакций).

Создание базы данных в системе SQL-сервер осуществляется командой CREATE DATABASE. Следует отметить, что процедура создания базы данных
в SQL-сервере требует наличия прав администратора сервера.

<определение_базы_данных> ::= 
   CREATE DATABASE имя_базы_данных
   [ON [PRIMARY]
   [ <определение_файла>  [,...n] ]
   [,<определение_группы> [,...n] ] ]
   [ LOG ON {<определение_файла>[,...n] } ]
   [ FOR LOAD | FOR ATTACH ]

Рассмотрим основные параметры представленного оператора.

При выборе имени базы данных следует руководствоваться общими
правилами именования объектов. Если имя базы данных содержит пробелы
или любые другие недопустимые символы, оно заключается в ограничители
(двойные кавычки или квадратные скобки). Имя базы данных должно быть
уникальным в пределах сервера и не может превышать 128 символов.

При создании и изменении базы данных можно указать имя файла, который
будет для нее создан, изменить имя, путь и исходный размер этого
файла. Если в процессе использования базы данных планируется ее
размещение на нескольких дисках, то можно создать так называемые вторичные файлы базы данных с расширением *.ndf. В этом случае
основная информация о базе данных располагается в первичном ( PRIMARY )
файле, а при нехватке для него свободного места добавляемая
информация будет размещаться во вторичном файле. Подход, используемый
в SQL-сервере, позволяет распределять содержимое базы данных по
нескольким дисковым томам.

Параметр ON определяет список файлов на диске для размещения
информации, хранящейся в базе данных.

Параметр PRIMARY определяет первичный файл. Если он опущен, то первичным является первый файл в списке.

Параметр LOG ON определяет список файлов на диске для размещения журнала транзакций. Имя файла для журнала транзакций генерируется на
основе имени базы данных, и в конце к нему добавляются символы _log.

При создании базы данных можно определить набор файлов, из которых
она будет состоять. Файл определяется с помощью следующей
конструкции:

<определение_файла>::=
   ([ NAME=логическое_имя_файла,]
   FILENAME='физическое_имя_файла'
   [,SIZE=размер_файла ]
   [,MAXSIZE={max_размер_файла |UNLIMITED } ]
   [, FILEGROWTH=величина_прироста ] )[,...n]

ru/2010/edi»>Здесь логическое имя файла – это имя файла, под которым он будет
опознаваться при выполнении различных SQL-команд.

Физическое имя файла предназначено для указания полного пути и
названия соответствующего физического файла, который будет создан на
жестком диске. Это имя останется за файлом на уровне операционной
системы.

Параметр SIZE определяет первоначальный размер файла; минимальный
размер параметра – 512 Кб, если он не указан, по умолчанию
принимается 1 Мб.

Параметр MAXSIZE определяет максимальный размер файла базы данных.
При значении параметра UNLIMITED максимальный размер базы данных
ограничивается свободным местом на диске.

При создании базы данных можно разрешить или запретить автоматический
рост ее размера (это определяется параметром FILEGROWTH ) и указать
приращение с помощью абсолютной величины в Мб или процентным
соотношением. Значение может быть указано в килобайтах, мегабайтах, гигабайтах, терабайтах или процентах (%). Если указано число без суффикса МБ, КБ или %, то по умолчанию используется значение MБ. Если размер шага роста указан в процентах (%), размер увеличивается на заданную часть в процентах от размера файла. Указанный размер округляется до ближайших 64 КБ.

Дополнительные файлы могут быть включены в группу:

<определение_группы>::=FILEGROUP имя_группы_файлов
    <определение_файла>[,...n]

Пример 3.1. Создать базу данных, причем для данных определить три
файла на диске C, для журнала транзакций – два файла на диске C.

CREATE DATABASE Archive
ON PRIMARY ( NAME=Arch2,
  FILENAME=’c:\user\data\archdat1.mdf’,
SIZE=100MB, MAXSIZE=200, FILEGROWTH=20),
(NAME=Arch3,  
  FILENAME=’c:\user\data\archdat2.mdf’,
  SIZE=100MB, MAXSIZE=200, FILEGROWTH=20),
(NAME=Arch4, 
  FILENAME=’c:\user\data\archdat3. mdf’,
  SIZE=100MB, MAXSIZE=200, FILEGROWTH=20)
LOG ON
(NAME=Archlog1,
  FILENAME=’c:\user\data\archlog1.ldf’,
    SIZE=100MB, MAXSIZE=200, FILEGROWTH=20),
(NAME=Archlog2,
  FILENAME=’c:\user\data\archlog2.ldf’,
    SIZE=100MB, MAXSIZE=200, FILEGROWTH=20)

Пример
3.1.
Создание базы данных.

Изменение базы данных

Большинство действий по изменению конфигурации базы данных
выполняется с помощью следующей конструкции:

<изменение_базы_данных> ::=  
  ALTER DATABASE имя_базы_данных
  { ADD FILE <определение_файла>[,...n] 
    [TO FILEGROUP имя_группы_файлов ]
  | ADD LOG FILE <определение_файла>[,...n]
  | REMOVE FILE логическое_имя_файла
  | ADD FILEGROUP имя_группы_файлов
  | REMOVE FILEGROUP имя_группы_файлов
  | MODIFY FILE <определение_файла>
  | MODIFY FILEGROUP имя_группы_файлов
  <свойства_группы_файлов>}

intuit.ru/2010/edi»>Как видно из синтаксиса, за один вызов команды может быть изменено не
более одного параметра конфигурации базы данных. Если необходимо
выполнить несколько изменений, придется разбить процесс на ряд
отдельных шагов.

В базу данных можно добавить ( ADD ) новые файлы данных (в указанную
группу файлов или в группу, принятую по умолчанию) или файлы журнала
транзакций.

Параметры файлов и групп файлов можно изменять ( MODIFY ).

Для удаления из базы данных файлов или групп файлов используется
параметр REMOVE. Однако удаление файла возможно лишь при условии его
освобождения от данных. В противном случае сервер не разрешит
удаление.

В качестве свойств группы файлов используются следующие:

READONLY – группа файлов используется только для чтения; READWRITE –
в группе файлов разрешаются изменения; DEFAULT – указанная группа
файлов принимается по умолчанию.

Удаление базы данных

Удаление базы данных осуществляется командой:

DROP DATABASE имя_базы_данных [,...n]

Удаляются все содержащиеся в базе данных объекты, а также файлы, в
которых она размещается. Для исполнения операции удаления базы данных
пользователь должен обладать соответствующими правами.

Как клонировать и копировать таблицы в MySql

MySql

Fomenko Alexander


• 2 min read

При работе с базами данных может возникнуть ситуация, когда вам в MySQL нужно клонировать или продублировать существующую таблицу в новую из-за их сходства в столбцах и атрибутах, или же, для проведения тестов без затрагивания исходной таблицы.

Я столкнулся с подобной ситуацией, когда мне нужно было создать структурную копию одной таблицы, заполнить её данными, а потом заменить ею исходную. Подход с двумя идентичными таблицами применялся для того, чтобы для посетителей сайта вдруг не возникло ситуации, что таблица очищена в ожидании заполнения новыми данными. Потому, сначала мы создаем купию таблицы в MySql с каким-то временным именем, наполняем её данными, а затем переименовываем по имени первой. В результате чего, пользователь увидит обновленные данные, и не будет момента, когда эта таблица может быть пустой.

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

В этой статье я покажу вам, как дублировать и клонировать существующие таблицы в SQL.

Простое клонирование

Первый метод называется Простое клонирование и, как следует из названия, он создает таблицу из другой таблицы без учета атрибутов столбцов и индексов.

CREATE TABLE new_table SELECT * FROM original_table;

Наприме, если у меня есть таблица users, я могу легко создать другую таблицу adminUsers, если мне не критично переносить атрибуты и индексы с таблицы users.

Приведенная ниже команда SQL создаёт простую структурную копию таблицы пользователей:

CREATE TABLE adminUsers SELECT * FROM users;

Используйте это для быстрого клонирования любою таблицы, которая будет включать только структуру и данные исходной таблицы.

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

Поверхностное клонирование в основном используется для создания копии существующей структуры данных таблицы и атрибутов столбца без копирования данных. Это только создаст пустую базу таблицы с идентичной структурой исходной таблицы.

CREATE TABLE new_table LIKE original_table;

Следующая команда создаст пустую базу таблицы на основе исходной таблице.

CREATE TABLE adminUsers LIKE users;

Используйте это, если вам нужна только структура данных и атрибуты столбцов исходной таблицы, без наполнения её данными из исходной.

Глубокое клонирование

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

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

Чтобы достичь этого, мы должны создать пустую таблицу на основе структуры и атрибутов исходной, затем выбрать данные из исходной таблицы и вставить их в новую таблицу.

CREATE TABLE new_table LIKE original_table;
INSERT INTO new_table SELECT * FROM original_table;

Потому, создадим структуру новой таблицы по исходной и наполним её данными:

CREATE TABLE adminUsers LIKE users;
INSERT INTO adminUsers SELECT * FROM adminUsers;

Еще одна интересная вещь: допустим, вам не нужны все данные из существующей таблицы, а нужны только некоторые данные по определённым условиям, тогда уточнение вашего SELECT-запроса — ваш лучший помощник.

Например, у нас есть пользователи с userType = «admin» в нашей таблице пользователей, и мы хотим копировать только этих пользователей в нашу новую таблицу, вы можете легко сделать это, выполнив запрос:

INSERT INTO adminUsers SELECT * FROM adminUsers where userType="admin";

Круто, правда? Надеюсь, что я ответил на вопрос о том, как в MySql клонировать таблицу и скопировать из неё данные в новую.

SQL Create Table — Хранение всех вещей

Назад

Таблица создания SQL — хранение всех вещей

Реляционные базы данных хранят информацию в таблицах — со столбцами, которые аналогичны элементам в структуре данных, и строками, которые являются одним экземпляром этой структуры данных — которые создаются с помощью инструкции SQL Create Table. При создании таблиц каждый указанный столбец может иметь две характеристики:

  • тип — какие данные могут храниться
  • ограничение — ограничения на данные

В этой записи блога рассматриваются многие распространенные типы данных SQL и ограничения, которые могут на них накладываться. Предоставляются практические примеры и исходный код. Структура таблицы может быть изменена после создания с помощью оператора SQL Alter.

Типы данных SQL

Поскольку поставщики баз данных выбирают, какой стандартный SQL ANSI имплементировать, а стандарт развивается, вам придется проверять свою конкретную базу данных на наличие допустимых типов данных и синонимов. Как правило, все базы данных поддерживают следующие типы данных:

Data Type SQL
Character CHAR, VARCHAR, CLOB
Binary BINARY, VARBINARY, BLOB
Numeric (exact) NUMERIC, DECIMAL, SMALLINT, INTEGER, BIGINT
Числовое (приблизительное) FLOAT, REAL, DOUBLE
Время DATE, TIME, TIMESTAMP 9 021

9002

INTERVAL, BOOLEAN, XML, JSON

Ограничения данных SQL

Ограничения — это необязательные правила, ограничивающие ввод данных в описываемый столбец. Поскольку поставщики баз данных могут настраивать свои предложения, проверьте, какие ограничения поддерживаются. Общие ограничения:

Ограничение Описание
ПРОВЕРКА Убедитесь, что все значения столбцов удовлетворяют определенным условиям.
ПО УМОЛЧАНИЮ Установите значение столбца, если оно не указано.
FOREIGN KEY Уникально идентифицирует строку/запись в другой таблице.
ИНДЕКС Оптимизация для быстрого поиска данных.
NOT NULL Убедитесь, что значение столбца содержит значение, отличное от NULL.
ПЕРВИЧНЫЙ КЛЮЧ Уникальная идентификация каждой строки с помощью комбинации NOT NULL и UNIQUE.
УНИКАЛЬНЫЙ Убедитесь, что все значения в столбце разные.

Базовый SQL Create Table & Constraint Examples

Оператор SQL Create Table выглядит так:

 CREATE TABLE имя_таблицы (
столбец_1 тип_данных столбец_ограничение,
столбец_2 тип_данных столбец_ограничение,
столбец_3 тип_данных столбец_ограничение,
. ..); 

Для иллюстрации давайте создадим таблицу для компаний и их биржевых кодов. И символ тикера, и названия компаний должны содержать что-то (например, NOT NULL ), а символы должны быть уникальными (как на реальных фондовых рынках).

 СОЗДАТЬ ТАБЛИЦУ компаний (
символ VARCHAR(6) НЕ NULL УНИКАЛЬНЫЙ,
имя VARCHAR(40) НЕ NULL,
ИНДЕКС(символ) );
 
ВСТАВИТЬ В КОМПАНИИ
ЦЕННОСТИ
(«GBTC», «Оттенки серого»),
(«МСТР», «МикроСтратегия»),
(«ЦЛА», «Тесла»);
ВЫБЕРИТЕ * ОТ компаний; 
символ имя
GBTC оттенки серого
MSTR MicroStrategy
TSLA Tesla

Еще одна таблица, которую мы заполним биографическими данными корпоративных сотрудников, покупающих активы, их компании, покупку активов. Мы ограничиваем возраст, чтобы гарантировать, что офицеры являются совершеннолетними, мы добавляем значение по умолчанию к сумме покупки и заставляем базу данных создавать идентификатор транзакции — монотонно возрастающее целочисленное значение, — которое мы идентифицируем как первичный ключ (для быстрого поиска). . Мы связываем таблицы закупок и компаний через тикер компании в качестве внешнего ключа (для проверки символов).

 СОЗДАТЬ ТАБЛИЦУ покупок (
    транзакция INT NOT NULL AUTO_INCREMENT,
    покупатель ВАРЧАР(50),
    age INT CHECK (возраст >= 18),
    компания ВАРЧАР(33),
    количество FLOAT ПО УМОЛЧАНИЮ 0.0,
    ПЕРВИЧНЫЙ КЛЮЧ (транзакция),
    FOREIGN KEY (компания) REFERENCES компании (символ)
    ) ;
 
ВСТАВИТЬ В покупки (покупатель, возраст, компания, сумма)
ЦЕННОСТИ
    ("Барри Силберт", 43 года, "GBTC", 449596),
    («Майкл Сэйлор», 56, «МСТР», 71079),
    ("Илон Маск", 49, "ЦЛА", 44776119)
;
ВЫБЕРИТЕ * ИЗ покупок ; 

1 40 TS

0021 44776119

transaction buyer age company amount
1 Barry Silbert 43 GBTC 449596
2 Майкл Сэйлор 56 MSTR 71079
3 Элон Маск

Ограничения, защищающие целостность данных

Попытка вставить в таблицу закупок строку со строкой компании, которая не отображается в таблице компаний, вызовет ошибку проверки данных (что и следовало ожидать, учитывая FOREIGN). ограничение KEY ). Например:

 ВСТАВЬТЕ В ПОКУПКИ (покупатель, возраст, компания, сумма)
ЗНАЧЕНИЯ ("Стив Джобс", 99, "AAPL", 0); 

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

Невозможно добавить или обновить дочернюю строку: ошибка ограничения внешнего ключа (`database`.`purchases`, CONSTRAINT `purchases_ibfk_1` FOREIGN KEY (`company`) REFERENCES `companies` (`symbol`))

Попытка вставка значения возраста менее 18 лет приведет к аналогичной ошибке.

SQL Create Table From

Поскольку эти таблицы сейчас «в производстве» — и, следовательно, их нельзя подделывать — для создания тестовой таблицы и заполнения ее датами, которые в настоящее время находятся в таблице закупок, мы можем:

 СОЗДАТЬ ТАБЛИЦУ Purchases_copy КАК ВЫБРАТЬ компанию, сумму ИЗ покупок ; 

SQL Drop Table

Аналогом создания таблиц является оператор SQL Drop Table, который удаляет структуру таблицы и данные внутри.

Заключение

SQL Create Table создает новые таблицы и может копировать существующие. Для каждого столбца могут быть указаны различные типы данных, а необязательные ограничения обеспечивают проверку целостности и достоверности данных. Некоторые ограничения обращены вовнутрь, например AUTO_INCREMENT , тогда как FOREIGN KEY обращается к другим таблицам для поддержки целостности.

Начать обучение

Чтобы узнать больше о SQL, зарегистрируйтесь в нашей программе SQL Nanodegree, подробно описанной здесь.

[et_bloom_locked optin_id=”optin_4″]

[/et_bloom_locked]

SQL — «СОЗДАТЬ ТАБЛИЦУ КАК ВЫБРАТЬ» Заявление

Александр Рубин
Insight для администраторов баз данных, MySQL
создать таблицу как выбранную, блокировки метаданных, MySQL, базу данных с открытым исходным кодом, блокировку строк, блокировку таблицы
7 комментариев

В этом сообщении блога я объясню, почему вам следует избегать использования оператора CREATE TABLE AS SELECT .

Оператор SQL «создать таблицу as select…» используется для создания обычной или временной таблицы и материализации результата выбора. Некоторые приложения используют эту конструкцию для создания копии таблицы. Это одна инструкция, которая сделает всю работу, поэтому вам не нужно создавать структуру таблицы или использовать другую инструкцию для копирования структуры.

В то же время есть ряд проблем с этим утверждением:

  1. Вы не создаете индексы для новой таблицы
  2. Вы смешиваете транзакционные и нетранзакционные операторы в одной транзакции. Как и любой DDL, он будет фиксировать текущие и незавершенные транзакции
  3. .

  4. CREATE TABLE … SELECT не поддерживается при использовании репликации на основе GTID
  5. Блокировки метаданных не будут сняты, пока инструкция не будет завершена

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

Тогда транзакция выглядит так:

начинать;
обновить количество учетных записей = сумма — 100000, где account_id=123;
— теперь мы рассчитываем сборы
создать таблицу как выбрать… присоединиться…
количество обновлений аккаунтов = сумма + 100000, где account_id=321;
совершить;

1

2

3

4

5

6

начало;

количество обновленных учетных записей = сумма — 100000, где account_id=123;

— теперь мы рассчитываем комиссию

создать таблицу как выбрать … присоединиться …

обновить учетные записи установить сумму = сумма + 100000 где account_id=321;

зафиксировать;

«Создать таблицу как выбор… присоединиться…» фиксирует небезопасную транзакцию. В случае ошибки второй счет, очевидно, не будет зачислен на уже совершенный дебет второго счета!

Ну, вместо «создать таблицу…» мы можем использовать «создать временную таблицу…», что устраняет проблему, так как создание временной таблицы разрешено.

Проблема с GTID

Если вы попытаетесь использовать CREATE TABLE AS SELECT, когда GTID включен (и ENFORCE_GTID_CONSISTENCY = 1), вы получите эту ошибку:

Общая ошибка: 1786 CREATE TABLE … SELECT запрещен, если @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.

Общая ошибка: 1786 CREATE TABLE … SELECT запрещен, если @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.

Код приложения может сломаться.

Проблема блокировки метаданных

Проблема блокировки метаданных для CREATE TABLE AS SELECT менее известна. (Дополнительная информация о блокировке метаданных в целом). Обратите внимание: блокировка метаданных MySQL отличается от взаимоблокировки InnoDB, блокировки на уровне строки и блокировки на уровне таблицы.

Это быстрое моделирование демонстрирует блокировку метаданных:

session1:

mysql> создать таблицу test2 как select * from test1;

mysql> создать таблицу test2 как select * from test1;

сессия 2:

mysql> выберите * из test2 limit 10;

mysql> выберите * из test2 limit 10;

— заблокировано оператор

Этот оператор ожидает блокировки метаданных:

session3:

mysql> показать список процессов;
+—-+——+————+——+———+——+- ——————+—————— —————————
| Идентификатор | Пользователь | Хост | дб | Команда | Время | государство | Информация
+—-+——+————+——+———+——+- ——————+—————— —————————
| 2 | корень | локальный | тест | Запрос | 18 | Отправка данных | создать таблицу test2 как выбрать * из test1
| 3 | корень | локальный | тест | Запрос | 7 | Ожидание блокировки метаданных таблицы | выберите * из test2 предел 10
| 4 | корень | локальный | НУЛЕВОЙ | Запрос | 0 | НУЛЕВОЙ | показать список процессов
+—-+——+————+——+———+——+- ——————+—————— —————————

1

2

3

4

5

6

7

8

mysql> показать список процессов;

+—-+——+————+——+———+—— +———————————+—————- —————————-

| Идентификатор | Пользователь | Хост      | БД   | Команда | Время | Состояние                           | Информация                                     

+—-+——+————+——+———+——+ ——————+—————- —————————

| 2 | корень | локальный | тест | Запрос   | 18 | Отправка данных                    | создать таблицу test2 как select * from test1

| 3 | корень | локальный | тест | Запрос   | 7 | Ожидание блокировки метаданных таблицы | выберите * из test2 limit 10              

| 4 | корень | локальный | НУЛЕВОЙ | Запрос   | 0 | NULL                           | показать список процессов                          

+—-+——+————+——+———+—— +———————————+—————- —————————-

То же самое может произойти и по-другому: медленный запрос на выборку может помешать некоторым операциям DDL (например, переименованию, удалению и т. д.):

mysql> показать список процессовG
*************************** 1-й ряд ********************** *******
Идентификатор: 4
Пользователь: корень
Хост: локальный
БД: report_stage
Команда: Запрос
Время: 0
Состояние: НУЛЕВОЕ
Информация: показать список процессов
Отправлено_строк: 0
Rows_examined: 0
Строки_прочитано: 0
*************************** 2-й ряд ********************** *******
Идентификатор: 5
Пользователь: корень
Хост: локальный
БД: тест
Команда: Запрос
Время: 9Состояние: копирование в таблицу tmp
Информация: выберите количество (*), имя из группы test2 по порядку имен по cid
Отправлено_строк: 0
Rows_examined: 0
Строки_прочитано: 0
**************************** 3-й ряд ********************** *******
Идентификатор: 6
Пользователь: корень
Хост: локальный
БД: тест
Команда: Запрос
Время: 5
Состояние: ожидание блокировки метаданных таблицы
Информация: переименуйте таблицу test2 в test4.
Отправлено_строк: 0
Rows_examined: 0
Строки_прочитано: 0
3 ряда в сете (0,00 сек)

1

2

3

4

5

6

7

8

10

110003

12

13

14

1999911110001

  • 9000 2

    14

    9000 3

    9000 3 9000 3 9000 2 9000 2

    14 9000 3

    9000 3

    9000 2

    9000 3 9000 3 9000 3

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    28

    29

    30

    0002 31

    32

    33

    34

    35

    36

    37

    38

  • mysql> показать список процессовG

    ****************************** 1. строка ************ ********* •

             Информация: показать список процессов 2. строка *******************************

               Id: 5

             Пользователь: root

             Хост: localhost

               db: test

          Command: Query

             Время: 9

            Состояние: Копирование в таблицу tmp0003

        Rows_sent: 0

    Rows_examined: 0

        Rows_read: 0

    ******************************* 3. строка *** *************************

               Id: 6

             Пользователь: root

             Хост: localhost

               db: test

    3

     

             Время: 5

            Состояние: Ожидание блокировки метаданных таблицы

             Информация: переименуйте таблицу test2 в test4

        Rows_sent: 0

    Rows_examined: 0

        Rows_read: 0

    3 строки в наборе (0,00 с)

    Как мы видим, CREATE TABLE AS SELECT может повлиять на другие запросы. Однако проблема здесь не в самой блокировке метаданных (блокировка метаданных нужна для сохранения согласованности). Проблема в том, что блокировка метаданных  не будет снята, пока инструкция не будет завершена.

    Решение простое: сначала скопируйте структуру таблицы, выполнив « создайте таблицу new_table как old_table», затем выполните «insert into new_table select…». Блокировка метаданных по-прежнему удерживается для части создания таблицы (очень короткой), но не для части «вставить…выбрать» (общее время удержания блокировки намного короче). Чтобы проиллюстрировать разницу, давайте рассмотрим два случая:

    1. При «создать таблицу table_new as select … from table1 » другие соединения приложений  не могут считывать данные из целевой таблицы (table_new) в течение заявление (даже «показывать поля из table_new» будет заблокировано)
    2. С помощью «создать таблицу new_table как old_table» + «вставить в new_table select…» другие соединения приложений не могут прочитать из целевой таблицы во время части «вставить в new_table select…».

    Однако в некоторых случаях структура таблицы заранее неизвестна. Например, нам может понадобиться материализовать результирующий набор сложного оператора select, включающего соединения и/или группировку. В этом случае мы можем использовать этот трюк:

    создать таблицу new_table as select…join…group by…limit 0;
    вставить в new_table как select… join… group by…

    создать таблицу new_table as select . .. присоединиться … сгруппировать по … limit 0;

    вставить в новую_таблицу как выбрать… присоединиться… сгруппировать по…

    Первый оператор создает структуру таблицы и не вставляет никаких строк ( LIMIT 0 ). Первый оператор устанавливает блокировку метаданных. Однако это очень быстро. Второй оператор фактически вставляет строки в таблицу и не устанавливает блокировку метаданных.

    Подробнее о блокировках метаданных и устранении неполадок в MySQL 5.7: 

    Быстрое устранение неполадок с блокировками метаданных в MySQL 5.7

    исходная СУБД для оперативной аналитической обработки. Его можно интегрировать с вашими приложениями, которые уже используют MySQL. Однако Clickhouse пока не поддерживает обновление/удаление. Не волнуйтесь, поскольку Джервин Реал из Percona подробно описал хитрую уловку для обновления и удаления строк путем реализации добавочного обновления в таблице Clickhouse.