Меню

Insert into ошибка mysql

Ok I have a very simple mysql database but when i try to run this query via mysql-admin i get weird errors

INSERT INTO customreports (study,
type, mode, select, description)
VALUES (‘1’, ‘2’, ‘3’, ‘4’, ‘5’);

Error:

1064 — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘select, description) VALUES (‘1’, ‘2’, ‘3’, ‘4’, ‘5’)’ at line 1

JNK's user avatar

JNK

62.2k15 gold badges121 silver badges137 bronze badges

asked May 26, 2009 at 20:10

The Digital Ninja's user avatar

You’re having problems because you’re using SQL reserved words as column names and not escaping them. Try like this:

INSERT INTO `customreports`
(`study`, `type`, `mode`, `select`, `description`)
VALUES
('1', '2', '3', '4', '5');

answered May 26, 2009 at 20:12

chaos's user avatar

2

Yeah, I would rewrite as:

INSERT INTO [customreports] ([study], [type], [mode], [select], [description]) VALUES (‘1’, ‘2’, ‘3’, ‘4’, ‘5’);

answered May 26, 2009 at 20:14

alex's user avatar

alexalex

9435 silver badges7 bronze badges

just a guess, but is reserved word «select» (listed as a column name) causing a problem?

answered May 26, 2009 at 20:13

KM.'s user avatar

KM.KM.

100k33 gold badges177 silver badges210 bronze badges

2

«SELECT» is a reserved word in SQL… use a different word than «select»

answered May 26, 2009 at 20:13

Jason's user avatar

JasonJason

50.9k37 gold badges133 silver badges185 bronze badges

The word ‘select’ is reserved in sql. The interpreter thinks you’re trying to use a SELECT statement inside the INSERT INTO statement. You need to enclose the field names so that the interpreter doesn’t read them as commands.

Update for MySQL:

insert into customreports ('study','type','mode','select','description') values...

answered May 26, 2009 at 20:14

Justin Niessner's user avatar

Justin NiessnerJustin Niessner

240k40 gold badges405 silver badges535 bronze badges

Correct per Chaos… but the critical thing to remember is you should do your best to NOT use RESERVED words as column names in a table… such as SELECT and TYPE…. not positive of the other three, but that’s where your conflict is. Yes, by being explicit with quotes around the fields will tell the SQL you mean the field within, but its also best to know WHY its failing, and not just a work-around resolution… helps prevent similar issues in the future.

answered May 26, 2009 at 20:15

DRapp's user avatar

DRappDRapp

47.2k12 gold badges71 silver badges142 bronze badges

Ditto the above, but I believe you need double quotes around the column names, not single quotes. Perhaps some flavors of SQL will process the single quotes correctly, but I think the standard says double quotes for field names, single quotes for field values.

answered May 26, 2009 at 20:31

Jay's user avatar

JayJay

26.6k10 gold badges59 silver badges112 bronze badges

1

#1 04.02.2010 14:43:43

tjslash
Участник
Зарегистрирован: 04.02.2010
Сообщений: 2

Ошибка INSERT INTO

Запрос вида:

INSERT INTO ‘products’  (cat, brends, divisions, article, name, quant, balls, price) VALUES (‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’)
 

Выдает ошибку:
#1064 — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near »products’  (cat, brends, divisions, article, name, quant, balls, price) VALUES ‘ at line 1

Подскажите, поджалуйста, что я делаю не так?

Неактивен

#2 04.02.2010 14:45:10

tjslash
Участник
Зарегистрирован: 04.02.2010
Сообщений: 2

Re: Ошибка INSERT INTO

Спасибо, проблему решил)

INSERT INTO products  (cat, brends, divisions, article, name, quant, balls, price) VALUES (‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’)

Неактивен

#3 04.02.2010 14:59:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5791

Re: Ошибка INSERT INTO

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

INSERT INTO `products`  (cat, brends, divisions, article, name, quant, balls, price) VALUES (‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’)

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

Неактивен

За последние 24 часа нас посетили 8762 программиста и 850 роботов. Сейчас ищут 384 программиста …


  1. selivanov

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4

    -не получается добавить запись в таблицу
    -соединение с бд есть
    -запрос и вывод данных работает
    -если команду cодержимое переменной $query вставить напрямую в phpmyadmin в -графический интерфейс SQL то запись проходит успешно что означает что синтасических ошибок нет

    //тестовый инсерт:
    $query = «INSERT INTO workers ( name, age, salary ) VALUES ( ‘Джон’, 20, 700 ) «;
    может причина в структуре таблицы

    http://joxi.ru/Q2K1nogs9NRygr


  2. TeslaFeo

    С нами с:
    9 мар 2016
    Сообщения:
    2.993
    Симпатии:
    759

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


  3. Deonis

    С нами с:
    15 фев 2013
    Сообщения:
    1.523
    Симпатии:
    504

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


  4. _ne_scaju_

    С нами с:
    25 ноя 2016
    Сообщения:
    2.147
    Симпатии:
    117

    @selivanov
    Покажи больше кусок кода, а то по одному запросу мало что ясно, в запросе все верно, и в структуре таблиц все хорошо.


  5. selivanov

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4

    задача-3 срабатывает а вот 4 задача где инсерт не работает

    1. //Выбрать работников с зарплатой 500$ и id больше 3.
    2. //Формируем тестовый запрос:
    3. $query = «SELECT * FROM workers WHERE salary = 500 && id > 3»;
    4. //Делаем запрос к БД, результат запроса пишем в $result:
    5. $result3 = mysqli_query($link, $query) or die(mysqli_error($link));
    6. for ($data = []; $row = mysqli_fetch_assoc($result3); $data[] = $row);
    7. //==========================================================================================
    8. //Задача. Добавьте нового работника Джона, 20 лет, зарплата 700$.
    9. //Формируем тестоввую запись:
    10. $query = «INSERT INTO  workers ( name, age, salary ) VALUES ( ‘Джон’, 20, 700 ) «;


  6. _ne_scaju_

    С нами с:
    25 ноя 2016
    Сообщения:
    2.147
    Симпатии:
    117

    А ниже INSERT запроса что находится?


  7. selivanov

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4


  8. _ne_scaju_

    С нами с:
    25 ноя 2016
    Сообщения:
    2.147
    Симпатии:
    117

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

    1. $query = «INSERT INTO  `workers` (`name`, `age`, `salary`) VALUES (‘Джон’, 20, 700)»;


  9. TeslaFeo

    С нами с:
    9 мар 2016
    Сообщения:
    2.993
    Симпатии:
    759


  10. _ne_scaju_

    С нами с:
    25 ноя 2016
    Сообщения:
    2.147
    Симпатии:
    117


  11. selivanov

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4

    мне не нужно вывести то что я инсертил я просто хочу увидеть результат инсерта прямо в phpadmin в обзоре таблицы но результат инсерта при обновлений страницы я не вижу


  12. _ne_scaju_

    С нами с:
    25 ноя 2016
    Сообщения:
    2.147
    Симпатии:
    117

    Выше код попробуй тебе привели.


  13. selivanov

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4


  14. TeslaFeo

    С нами с:
    9 мар 2016
    Сообщения:
    2.993
    Симпатии:
    759

    1. // присвоит строку запроса переменной $query. Запрос не выполнится, а просто создастся строка
    2. $query=«INSERT INTO  `workers` (`name`, `age`, `salary`) VALUES (‘Джон’, 20, 700)»;


  15. selivanov

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4

    так и сделал говорю не работает


  16. selivanov

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4

    во

    во сработало но после того как вставил обратные кавычки а про них ты ничего не сказал
    аияияи
    с меня спс и большой лайк


  17. _ne_scaju_

    С нами с:
    25 ноя 2016
    Сообщения:
    2.147
    Симпатии:
    117


  18. selivanov

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4


  19. _ne_scaju_

    С нами с:
    25 ноя 2016
    Сообщения:
    2.147
    Симпатии:
    117


  20. MouseZver

    С нами с:
    1 апр 2013
    Сообщения:
    7.561
    Симпатии:
    1.284
    Адрес:
    Лень

    пи3дец как легко оказалось


  21. selivanov

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4

    у меня вопрос почему же тогда это синтаксис $query = «INSERT INTO workers ( name, age, salary ) VALUES ( ‘Джон’, 20, 700 ) «;
    если вставить в phpmyadmin в SQL то ошибку не показывает и успешно выполняет команду инсерт
    а из редактора кода (phpstorm) не пишет в таблицу?


  22. _ne_scaju_

    С нами с:
    25 ноя 2016
    Сообщения:
    2.147
    Симпатии:
    117

    потому что у тебя один sql код в условии, и ты его не выполняешь.


  23. selivanov

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4

So, you’re creating a custom SQL query to perform a task in the database. After putting the code together and running it in PHPmyAdmin it responds with a 1064 error. It may look similar to this:

1064 error message

The 1064 error displays any time you have an issue with your SQL syntax, and is often due to using reserved words, missing data in the database, or mistyped/obsolete commands. So follow along and learn more about what the 1064 error is, some likely causes, and general troubleshooting steps.

Note: Since syntax errors can be hard to locate in long queries, the following online tools can often save time by checking your code and locating issues:

  • PiliApp MySQL Syntax Check
  • EverSQL SQL Query Syntax Check & Validator

Causes for the 1064 error

  • Reserved Words
  • Missing Data
  • Mistyped Commands
  • Obsolete Commands

This may seem cryptic since it is a general error pointing to a syntax issue in the SQL Query statement. Since the 1064 error can have multiple causes, we will go over the most common things that will result in this error and show you how to fix them. Follow along so you can get your SQL queries updated and running successfully.

Using Reserved Words

Every version of MySQL has its own list of reserved words. These are words that are used for specific purposes or to perform specific functions within the MySQL engine. If you attempt to use one of these reserved words, you will receive the 1064 error. For example, below is a short SQL query that uses a reserved word as a table name.

CREATE TABLE alter (first_day DATE, last_day DATE);

How to fix it:

Just because the word alter is reserved does not mean it cannot be used, it just has special requirements to use it as the MySQL engine is trying to call the functionality for the alter command. To fix the issue, you will want to surround the word with backticks, this is usually the button just to the left of the “1” button on the keyboard. The code block below shows how the code will need to look in order to run properly.

CREATE TABLE `alter` (first_day DATE, last_day DATE);

Missing Data

Sometimes data can be missing from the database. This causes issues when the data is required for a query to complete. For example, if a database is built requiring an ID number for every student, it is reasonable to assume a query will be built to pull a student record by that ID number. Such a query would look like this:

SELECT * from students WHERE studentID = $id

If the $id is never properly filled in the code, the query would look like this to the server:

SELECT * from students WHERE studentID =

Since there is nothing there, the MySQL engine gets confused and complains via a 1064 error.

How to fix it:

Hopefully, your application will have some sort of interface that will allow you to bring up the particular record and add the missing data. This is tricky because if the missing data is the unique identifier, it will likely need that information to bring it up, thus resulting in the same error. You can also go into the database (typically within phpMyAdmin) where you can select the particular row from the appropriate table and manually add the data.

Mistyping of Commands

One of the most common causes for the 1064 error is when a SQL statement uses a mistyped command. This is very easy to do and is easily missed when troubleshooting at first. Our example shows an UPDATE command that is accidentally misspelled.

UDPATE table1 SET id = 0;

How to fix it:

Be sure to check your commands prior to running them and ensure they are all spelled correctly.

Below is the syntax for the correct query statement.

UPDATE table1 SET id = 0;

Obsolete Commands

Some commands that were deprecated (slated for removal but still allowed for a period of time) eventually go obsolete. This means that the command is no longer valid in the SQL statement. One of the more common commands is the ‘TYPE‘ command. This has been deprecated since MySQL 4.1 but was finally removed as of version 5.1, where it now gives a syntax error. The ‘TYPE‘ command has been replaced with the ‘ENGINE‘ command. Below is an example of the old version:

CREATE TABLE t (i INT) TYPE = INNODB;

This should be replaced with the new command as below:

CREATE TABLE t (i INT) ENGINE = INNODB;

For developers or sysadmins experienced with the command line, get High-Availability and Root Access for your application, service, and websites with Cloud VPS Hosting.

Error 1064 Summary

As you can see there is more than one cause for the 1064 error within MySQL code. Now, you know how to correct the issues with your SQL Syntax, so your query can run successfully. This list will be updated as more specific instances are reported.

Введение 

В статье  расскажем, для чего нужна команда INSERT в MySQL и покажем как ей пользоваться на десяти практических примерах.

Команда INSERT используется для того, чтобы вставлять новые данные в таблицы. Общий и наиболее часто используемый синтаксис выглядит так:

    INSERT into table_name
[(column1, [, column2] ...)]
values (values_list)

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

Создаем базу MySQL в облаке

Прежде чем начать работать с командой Insert, нам нужна база данных MySQL. Чтобы не заниматься долгой установкой и настройкой, мы создадим управляемую БД на платформе Selectel. Если сервер MySQL у вас уже установлен, можете сразу переходить к следующему разделу.

Заходим в личный кабинет, в разделе «Облачная платформа» переходим к «Базам данных». Нажимаем кнопку «Создать кластер».    

Создание базы данных в панели Selectel

На следующем экране выбираем параметры новой базы. Выбираем «СУБД» — MySQL. Далее необходимо выбрать конфигурацию сервера: нам будет достаточно 2 vCPU, 4 ГБ оперативной памяти и 32 ГБ диска. Обратите внимание на раздел «Сеть» — у вас должна быть выбрана публичная сеть, чтобы к базе данных можно было подключиться из интернета. Остальные параметры можно оставить по умолчанию.

Конфигурация для нового кластера БД

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

Создание пользователя

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

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

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

Добавление доступа к базе

Все, БД настроена и к ней можно подключаться. Чтобы узнать параметры подключения, перейдите на вкладку «Настройки» и там в самом низу в разделе «Подключение» указаны нужные параметры. Вы можете пользоваться консольным клиентом или любой графической утилитой. Мы будем показывать на примере консольного клиента, поэтому строка для подключения будет выглядеть вот так:

    mysql --host=109.71.10.30 
      --port=6033 
      --user=chrystal 
      --password 
      --database=db

После ввода этой команды консоль попросит нас ввести пароль. Вот и все, мы подключились к БД.

Структура таблиц для примеров

Все дальнейшие команды мы будем показывать на простом примере из трех таблиц. Допустим, мы — сеть фруктовых магазинов. У нас есть таблица со списком магазинов, таблица со списком товаров (фруктов) и таблица, в которой мы записываем какой фрукт в каком магазине продается и по какой цене.

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

  • stores, таблица магазинов:
    +----+------------------+--------------+
| id | name             | address      |
+----+------------------+--------------+
|  1 | Магазин 1        | Адрес 1      |
|  2 | Магазин 2        | Адрес 2      |
|  3 | Магазин 3        | Адрес 3      |
+----+------------------+--------------+

  • fruits, таблица фруктов:
    +----+------------------+
| id | name             |
+----+------------------+
|  1 | Яблоко           |
|  2 | Мандарин         |
|  3 | Банан            |
+----+------------------+

  • sale, таблица наличия товаров и цены:
    +----------+----------+-------+-------+
| store_id | fruit_id | price | count |
+----------+----------+-------+-------+
|        1 |        3 |    60 |    20 |
|        2 |        2 |    80 |    10 |
|        3 |        1 |   120 |    12 |
+----------+----------+-------+-------+

Пример 1: базовое использование команды INSERT

Начнем с самого простого использования команды INSERT в MySQL. Добавим новый фрукт в справочник фруктов. Команда будет выглядеть так:

    INSERT INTO fruits VALUES (4, 'Апельсин');

Проверяем таблицу фруктов и видим, что появилась новая запись:

    +----+------------------+
| id | name             |
+----+------------------+
|  1 | Яблоко           |
|  2 | Мандарин         |
|  3 | Банан            |
|  4 | Апельсин         |
+----+------------------+


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

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

    INSERT INTO stores (id, name) VALUES (4, 'Магазин 4');

Обратите внимание, что в таблице stores у нас еще есть столбец с адресом, но мы его не указали. Посмотрим, что вставилось в таблицу:

    +----+------------------+--------------+
| id | name             | address      |
+----+------------------+--------------+
|  1 | Магазин 1        | Адрес 1      |
|  2 | Магазин 2        | Адрес 2      |
|  3 | Магазин 3        | Адрес 3      |
|  4 | Магазин 4        | NULL         |
+----+------------------+--------------+

Мы видим указанные нами значения, а в поле address вставилось значение NULL.

Пример 2: вставка нескольких строк

За один запрос можно добавлять сразу несколько элементов. Например, мы хотим добавить три новых фрукта. Вместо того, чтобы писать три отдельных команды INSERT, мы воспользуемся вот таким способом записи:

    INSERT INTO fruits VALUES (5, 'Киви'), (6, 'Виноград'), (7, 'Груша');

Посмотрим результат. Видим, что появилось сразу три новых записи:

    +----+------------------+
| id | name             |
+----+------------------+
|  1 | Яблоко           |
|  2 | Мандарин         |
|  3 | Банан            |
|  4 | Апельсин         |
|  5 | Киви             |
|  6 | Виноград         |
|  7 | Груша            |
+----+------------------+

Пример 3: использование SET

В команде INSERT мы обычно указываем отдельно столбцы и отдельно значения. Но есть способ записи, похожий на команду UPDATE: указывать столбцы и их значения через символ равенства. Такой способ может быть удобен, когда в таблице много полей и значений. Так сразу видно, в какое поле какое значение подставляется.

    INSERT INTO sale SET store_id=1, fruit_id=1, price=89, count=3;

Проверим, что числа вставились именно в те столбцы, которые мы указали:

    +----------+----------+--------+-------+
| store_id | fruit_id | price  | count |
+----------+----------+--------+-------+
|        1 |        3 |     60 |    20 |
|        2 |        2 |     80 |    10 |
|        3 |        1 |    120 |    12 |
|        1 |        1 |     89 |     3 |
+----------+----------+--------+-------+

Пример 4: вставка с выражением

Во всех предыдущих примерах мы указывали явное значение для столбца. Но в MySQL можно использовать арифметические выражения, например сумму, разность, умножение и так далее. Допустим, мы хотим добавить запись в таблицу sale о том что в магазине № 2 продаются апельсины по 137 рублей. Но потом мы решаем, что хотим сделать скидку 6%. Чтобы не высчитывать ее самим, мы можем использовать такой запрос:

    INSERT INTO sale VALUES (2, 4, 137*0.94, 5);

Мы умножаем 137 рублей на 0.94, это и есть скидка 6%. Проверим что у нас получилось:

    +----------+----------+--------+-------+
| store_id | fruit_id | price  | count |
+----------+----------+--------+-------+
|        1 |        3 |     60 |    20 |
|        2 |        2 |     80 |    10 |
|        3 |        1 |    120 |    12 |
|        1 |        1 |     89 |     3 |
|        2 |        4 | 128.78 |     1 |
+----------+----------+--------+-------+

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

В качестве источника данных для вставки можно использовать другую таблицу. Предположим, у нас есть таблица fruits_new, где хранится список фруктов, которые мы заказали у поставщиков, но эти фрукты еще не продаются в наших магазинах. И вот наконец-то нам привезли два новых фрукта, которые мы так давно ждали. Но вместо того, чтобы переписывать эти названия в команду INSERT, мы можем просто использовать таблицу fruits_new и загружать данные из нее. Для этого нам понадобится оператор SELECT:

    INSERT INTO fruits
SELECT * FROM fruits_new
WHERE id = 8;

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

    INSERT INTO fruits (name, id)
SELECT name, id FROM fruits_new
WHERE id = 9;


Проверим результат. После выполнения этих двух команд у нас должно появиться две новых строки:

    +----+------------------+
| id | name             |
+----+------------------+
|  1 | Яблоко           |
|  2 | Мандарин         |
|  3 | Банан            |
|  4 | Апельсин         |
|  5 | Киви             |
|  6 | Виноград         |
|  7 | Груша            |
|  8 | Ананас           |
|  9 | Вишня            |
+----+------------------+

Пример 6: вставка значения по умолчанию

Обычно, если в MySQL для столбца не указано значение, то команда INSERT INTO подставляет NULL. Но если при создании таблицы у этого столбца было указано значение по умолчанию (default), тогда подставится именно оно. В нашей таблице sale у столбца count значение по-умолчанию равно единице. Проверим это, вставив новую запись без указания этого столбца:

    INSERT INTO sale (store_id, fruit_id, price) VALUES(4, 7, 50);

Проверяем результат. Мы не указывали значение для столбца count, но автоматически подставлилось значение 1.

    +----------+----------+--------+-------+
| store_id | fruit_id | price  | count |
+----------+----------+--------+-------+
|        1 |        3 |     60 |    20 |
|        2 |        2 |     80 |    10 |
|        3 |        1 |    120 |    12 |
|        1 |        1 |     89 |     3 |
|        2 |        4 | 128.78 |     5 |
|        4 |        7 |     50 |     1 |
+----------+----------+--------+-------+

Пример 7: вставка или обновление при дубликате

В MySQL нельзя добавить строку в таблицу, у которой дублируется первичный ключ (primary key). В наших таблицах stores и fruits поле id — это первичный ключ. Поэтому если мы попробуем добавить в таблицу fruit значение с id=1, то MySQL выдаст ошибку.

Но существует похожая на INSERT команда — REPLACE, которая умеет перезаписывать значения. Она работает как INSERT и UPDATE одновременно: если в таблице еще нет записи с таким первичным ключом, команда создаст новую запись; а если уже есть — заменит ее.

    REPLACE INTO fruits VALUES (1, 'Лимон');

Проверяем результат и видим, что вместо яблока у нас появился лимон с тем же идентификатором.

    +----+------------------+
| id | name             |
+----+------------------+
|  1 | Лимон            |
|  2 | Мандарин         |
|  3 | Банан            |
|  4 | Апельсин         |
|  5 | Киви             |
|  6 | Виноград         |
|  7 | Груша            |
|  8 | Ананас           |
|  9 | Вишня            |
+----+------------------+

Пример 8: игнорирование ошибки при вставке

Продолжим предыдущий пример. Допустим, записи в нашу таблицу вставляет бэкенд-сервис приложения. Мы хотим, чтобы сервис попробовал вставить новую запись, но если такой первичный ключ уже существует — ничего не обновлял и просто шел выполнять другой код. Но при совпадении ключей MySQL выдаст ошибку, а код на бэкенде прервется и ее нужно будет обрабатывать в сервисе. Гораздо проще добавить к команде INSERT ключевое слово IGNORE, чтобы при совпадении первичного ключа MySQL не генерировал ошибку:

    INSERT IGNORE INTO stores VALUES (1, 'Магазин 10', 'Адрес 10');

Обратите внимание на сообщение, которое выдает MySQL, оно будет примерно таким: Query OK, 0 rows affected, 1 warning. Это значит, что запрос выполнился успешно, при этом он не затронул ни одну строки и есть одно предупреждение. Проверим результат: видим, что новых магазинов не появилось, а текущие не изменились.

    +----+------------------+--------------+
| id | name             | address      |
+----+------------------+--------------+
|  1 | Магазин 1        | Адрес 1      |
|  2 | Магазин 2        | Адрес 2      |
|  3 | Магазин 3        | Адрес 3      |
|  4 | Магазин 4        | NULL         |
+----+------------------+--------------+

Пример 9: вставка записи в определенные партиции

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

  • p0 для записей, у которых count от 0 до 100 
  • p1 для записей, у которых count от 101 до 150.

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

    INSERT INTO sale PARTITION (p0) VALUES (1, 9, 130, 10);

Кроме того, в одной команде мы можем вставлять данные сразу в несколько партиций. Это делается так:

    INSERT INTO sale PARTITION (p0, p1) VALUES (4, 8, 90, 10), (3, 7, 50, 120);

Пример 10: изменение приоритета

В некоторых движках таблиц MySQL (например, в MyISAM, MEMORY и MERGE) можно изменить приоритет вставки данных. Например, можно сделать так, что если таблицу считывает команда SELECT, то команда INSERT будет ждать ее завершения. Это делается с помощью ключевого слова LOW_PRIORITY:

    INSERT LOW_PRIORITY INTO sale VALUES (1, 6, 40, 3);

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

    INSERT HIGH_PRIORITY INTO sale VALUES (1, 6, 40, 3);

Но нужно иметь ввиду, что если к таблице активно идут SELECT-запросы, то команда INSERT с низким приоритетом может ждать своей очереди довольно долго.

Заключение

Мы рассмотрели команду INSERT и познакомились с десятью самыми основными способами ее использования. Вы узнали, как с помощью SQL команды можно добавить новую строку в таблицу или обновить существующую. Зная эти основы, вы можете начать писать INSERT-запросы для своей структуры БД.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Insatiable boot device ошибка
  • Ins ошибка мерседес актрос мп1