Sql добавить строку в таблицу: SQL- 13. (INSERT INTO)

Запросы SQL для обновления данных (UPDATE)

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

В SQL, изменить запись в таблице БД можно с помощью команды UPDATE. В самом минимальном виде команда обновления данных выглядит следующим образом:

UPDATE таблица SET поле = значение

Здесь, UPDATE – команда указывающая, что запрос на обновление данных;

таблица – название таблицы, в которой будет проводиться изменения;

SET – команда, после которой через запятую указываются поля с назначаемыми им значениями;

поле – поле таблицы, в которое будет внесено изменение;

значение – новое значение, которое будет внесено в поле.

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

UPDATE goods SET price = 0

В этом случае, поле price абсолютно во всех имеющиеся строках таблицы примет значение 0.

Изменение одного значения

Изменение значения всех полей в таблице необходимо крайне редко. Чаще всего необходимо поменять значение какой-то конкретной записи. Для этого в завершении строки с командой UPDATE будет добавлена директива WHERE, в которой указывается условие, определяющее с какой именно строкой нужно выполнить операцию обновления.

Имеется таблица:






num
(номер товара)
title
(название)
price
(цена)
1Чайник300
2Чашка100
3Ложка25
4Тарелка100

Для примера, нужно обновить стоимость товара с известным нам его значением num. Для этого, выполним следующий запрос:

UPDATE goods SET price = 150 WHERE num = 2

Теперь, перед операцией изменения полей, будет выбрана строка, удовлетворяющая условию num = 2. Такая строка в таблице одна. В этой стоке цена и будет изменена на значение 150. В результате получим таблицу с измененной ценой товара.

Внесение изменений в несколько строк с условием отбора

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

Например, мы хотим уменьшить в два раза цену всех товаров, которые сейчас стоят от 100 и более. Запрос:

UPDATE goods SET price = price / 2 WHERE price >= 100

Условие WHERE здесь содержит правило, по которому будут выбраны только товары с ценой равной или более 100, а те товары, цена у которых ниже 100, затронуты запросом не будут.

price = price / 2 – формула, по которой будет вычисляться новая цена товаров. Новая цена будет записана равной старой цене поделенной на два.

В результате выполнения такого запроса получим таблицу с измененными записями:






num
(номер товара)
title
(название)
price
(цена)
1Чайник150
2Чашка50
3Ложка25
4Тарелка50

Обновление значений в нескольких полях строки

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

UPDATE goods SET title = "утюг", price = 300 WHERE num = 2

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

Выше приведены основные виды операций обновления. На их основе формируется запросы для решения большинства задач изменения данных в разработке с применением SQL.

Пара слов про Alter Table, или как делать не надо / Хабр


Это скорее не статья, а небольшая заметка о некоторых особенностях работы с большими таблицами в MySQL.

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


Итак, как-то вечерком, дабы не тревожить наших дорогих заказчиков, понадобилось нам добавить колонку в таблицу.

Чтобы было понятнее, характеристики таблицы и базы:

  • размер таблицы 110Gb
  • число строк: 7.5 млн
  • storage engine: InnoDB
  • есть два sql-сервера, соединенных по схеме master-slave, при этом master — на SSD, а slave — на HDD


Вроде бы очевидное решение для добавления колонки — Alter Table.

alter table table_name add source varchar(32)


Им мы и воспользовались (да, мы понимали, что это плохо, но в данном конкретном случае риски были минимальны).

Результаты оказались довольно неприятными:

  • на мастере процесс добавления колонки шел около часа (!)
  • на слейве он начался после окончания процесса на мастере и продолжался около 8 часов (!!)
  • во время выполнения alter table на слейве полностью остановилась репликация данных (!!!)


Но нет худа без добра: небольшой бонус оказался в том, что после добавления колонки размер таблицы уменьшился на 10%.

На графиках ниже это наглядно видно.

График загрузки CPU на мастере.

График загрузки CPU на слейве.

Отставание репликации.

Какие неприятности ждут тех, кто делает это на боевых таблицах?

Во-первых, на время выполнения Alter Table нельзя писать данные в таблицу (но можно читать). На самом деле это зависит от версии MySQL, в последних это не так, но тем не менее надо понимать, на что способна именно Ваша версия, дабы избежать неприятностей.

Соответственно, если таблица большая, то время недоступности будет значительным (как у нас, при использовании SSD это заняло час, а на обычном диске — 8 часов), что вряд ли ожидают Ваши заказчики.

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

Еще один неочевидный момент, с которым мы столкнулись во время добавления колонки (но это было в другой раз) — на диске нужно дополнительное место.

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

Кроме того, во время выполнения всяких Alter Table все изменения записываются в лог-файл, чтобы после изменений накатить данные за то время, в течение которого проводилась операция. И тут тоже может ждать неприятный сюрприз: если таблица изменяется долго, а объем операций большой, то может закончится не только место на диске, но и превыситься лимит на размер файла, указанный в настройках SQL. В любом случае Вас ожидает «the online DDL operation fails, and uncommitted concurrent DML operations are rolled back».

Мы столкнулись с тем, что каталог для временных файлов был маловат, в результате пришлось переопределить innodb_tmpdir.

Посмотреть, куда указывает переменная в данный момент, можно так:

select @@GLOBAL.innodb_tmpdir;


Имейте ввиду, что размер временного каталога также может быть нужен размером с таблицу + индексы. В общем, запасайтесь местом.

Дабы не повторять документацию, более детально читайте по ссылке https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-space-requirements.html

А как же делать надо? На самом деле нет единого рецепта на все случаи жизни.

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

  • Создаем новую таблицу с нужной структурой
  • Заполняем поля из старой таблицы
  • Удаляем или переименовываем старую таблицу
  • Переименовываем новую


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

UPD. Пользователь syavadee посоветовал использовать percona online schema change. По сути она реализует описанный выше алгоритм с дополнительными плюшками.

UPD. Пользователь arheops рекомендует включить parallel replication/gtid для решения проблем с репликацией.

Ну и попутно, иногда, чтобы понять, насколько большая таблица и сколько в ней строк, нужно, как учат, сделать

select count(*) from table_name


Но на больших и нагруженных таблицах это тоже не самая быстрая операция, особенно когда у вас с пол миллиона строк и больше.

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

SHOW TABLE STATUS FROM express where name='table_name'


К сожалению, на движке InnoDB полученный размер может отличаться процентов на 50 (в нашем случае с таблицей выше реальное число записей порядка 7. 5 млн, а указанный способ показал только 5 млн), но для ориентировочной оценки это вполне подходит.

На этом все, надеюсь, заметка кому-то поможет избежать больших неприятностей с якобы безобидными командами SQL.

строк | Документация DataGrip

Вы можете добавлять, редактировать или удалять строки в редакторе данных.

Управление строками

Добавление строки

  1. Щелкните значок Добавить строку () на панели инструментов. Либо щелкните правой кнопкой мыши таблицу и выберите «Добавить строку» в контекстном меню.

  2. Нажмите Alt+Insert . ⇧ K» data-secondary_macos_system_shortcuts=»⌘ ⌫» data-primary_sublime_text=»Ctrl+Shift+K» data-primary_emacs=»N/A» data-primary_xwin=»Ctrl+Y» data-secondary_intellij_idea_classic_macos=»⌘ Y»> Ctrl+Y или Удалить .

Удалить все строки в таблице

Клонировать строки

  • Вы можете клонировать выбранную строку. Копия строки добавляется в конец таблицы.

    Чтобы клонировать строку, щелкните строку правой кнопкой мыши и выберите «Клонировать строку». Либо выберите строку и нажмите Ctrl+D .

Редактировать несколько строк

В этой главе описывается, как можно одновременно редактировать несколько выбранных строк.

Вставка строк CSV

В DataGrip можно напрямую вставлять несколько строк CSV в таблицу. Исходные строки будут разбиты на столбцы в соответствии с запятыми. Содержимое строк CSV заменит содержимое строк таблицы. Если в таблице недостаточно строк, будут созданы новые.

  1. Выберите строки, в которые вы хотите вставить строки CSV.

    Или выберите строку таблицы, в которую вы хотите вставить первую строку строк CSV.

  2. Нажмите Ctrl+V . Либо выберите Вставить в контекстном меню.

Установка количества строк в редакторе данных

Установка количества строк в результирующем наборе

  • По умолчанию при выполнении запроса количество возвращаемых строк ограничено 500. Это ограничение вводится, чтобы избежать перегрузки (например, когда ваш оператор SELECT возвращает один миллион строк).

    Чтобы изменить это ограничение, откройте настройки параметров Ctrl+Alt+S и перейдите к базе данных | Редактор данных и просмотрщик. В ограничениях | Ограничьте размер страницы полем, укажите новое число. Чтобы отключить ограничение, снимите флажок Ограничить размер страницы до.

    Также можно щелкнуть список Изменить размер страницы в редакторе и выбрать предопределенное значение.

Сделать все строки видимыми одновременно

  1. Открыть настройки Ctrl+Alt+S и перейти к базе данных | Представления данных.

  2. Снимите флажок Ограничить размер страницы до и нажмите OK.

  3. Нажмите кнопку «Обновить» или нажмите Ctrl+F5 , чтобы обновить представление таблицы.

Навигация между строками

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

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

Переход между подмножествами строк

  • : Переход к первой странице набора результатов.

  • : переход на предыдущую страницу набора результатов. Либо нажмите Ctrl+Alt+Up .

  • : переход к следующей странице набора результатов. Либо нажмите Ctrl+Alt+Down .

  • : переход к последней странице набора результатов.

Перейти к указанной строке

Переход к объекту DDL

  • Щелкните правой кнопкой мыши столбец в таблице и выберите Перейти. В подменю «Перейти» вы можете выбрать, к какому типу связанных строк вы хотите перейти.

    • Строки, на которые ссылаются: строки, на которые ссылается текущий объект.

    • Ссылающиеся строки: строки, которые ссылаются на текущий объект.

    • Все связанные строки: как ссылочные, так и ссылочные строки.

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

    Кроме того, вы можете посмотреть видео Навигация по внешним ключам на youtube.com в качестве другого примера.

Последнее изменение: 21 апреля 2023 г.

Ячейки фильтра

SQL — ВСТАВИТЬ новую строку, используя сумму двух существующих строк из одной таблицы

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

Таблица выглядит примерно так и получившуюся вставку я хочу получить

 ---------------------------------- ------------------
| деятельность | место | дата_начала | дата_окончания | цена |
-------------------------------------------------- -------------------------------------------
| работает | тренажерный зал | 2020-6-1 | 2020-7-1 | 10 | > | спорт | тренажерный зал | 2020-6-1 | 2020-7-1 | 30 |
-------------------------------------------------- - ----------------------------------------------------------
| прыжки | тренажерный зал | 2020-6-1 | 2020-7-1 | 20 |
-------------------------------------------------- -
 

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