MySQL Вставить, где запрос - PullRequest
104 голосов
/ 27 января 2009

Что не так с этим запросом:

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Работает без предложения WHERE. Кажется, я забыл свой SQL ..

Ответы [ 25 ]

209 голосов
/ 27 января 2009

MySQL INSERT Синтаксис не поддерживает предложение WHERE, поэтому ваш запрос в его текущем состоянии не будет выполнен. Предполагая, что ваш столбец id является уникальным или первичным ключом:

Если вы пытаетесь вставить новую строку с идентификатором 1, вы должны использовать:

INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);

Если вы пытаетесь изменить значения веса / желаемого веса для существующей строки с идентификатором 1, вы должны использовать:

UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;

Если вы хотите, вы также можете использовать синтаксис INSERT .. ON DUPLICATE KEY, например:

INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

ИЛИ даже так:

INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

Также важно отметить, что если ваш столбец id является столбцом автоинкремента, вы можете также пропустить его из своей INSERT все вместе и позволить mysql увеличить его как обычно.

39 голосов
/ 27 января 2009

Нельзя объединить предложение WHERE с предложением VALUES. Насколько я знаю, у вас есть два варианта -

  1. ВСТАВИТЬ заданные значения

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
    
  2. ВСТАВИТЬ, используя инструкцию SELECT

    INSERT INTO Users(weight, desiredWeight) 
    SELECT weight, desiredWeight 
    FROM AnotherTable 
    WHERE id = 1
    
19 голосов
/ 27 января 2009

Вы используете предложение WHERE для запросов UPDATE. Когда вы вставляете, вы предполагаете, что строка не существует.

В MySQL, если вы хотите INSERT или UPDATE, вы можете использовать запрос REPLACE с предложением WHERE. Если ГДЕ не существует, он ВСТАВЛЯЕТ, в противном случае он ОБНОВЛЯЕТ.

EDIT

Я думаю, что мысль Билла Карвина достаточно важна, чтобы извлечь из комментариев и сделать ее очень очевидной. Благодаря Биллу, прошло слишком много времени с тех пор, как я работал с MySQL, я вспомнил, что у меня были проблемы с REPLACE, но я забыл, что они были. Я должен был это посмотреть.

Это не то, как работает ЗАМЕНА MySQL. Он выполняет УДАЛЕНИЕ (которое может быть неактивным, если строка не существует), за которым следует ВСТАВКА. Подумайте о последствиях виз. триггеры и зависимости внешнего ключа. Вместо этого используйте INSERT ... ON DUPLICATE KEY UPDATE.

9 голосов
/ 27 января 2009

Я не верю, что у вставки есть предложение WHERE.

5 голосов
/ 06 августа 2012

Запрос вставки не поддерживает ключевое слово *

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

Например:

INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';

Поместив «select» в оператор вставки, вы можете быстро выполнить несколько операций вставки.

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

SELECT count(*)
FROM customers
WHERE city = 'Newark';

Вы можете убедиться, что не вставляете дублирующую информацию, используя условие EXISTS.

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

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

Этот оператор вставляет несколько записей с подвыбором.

Если вы хотите вставить одну запись, вы можете использовать следующий оператор:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

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

См. Также Как вставить с помощью предложения where

4 голосов
/ 06 июля 2011

Правильный ответ на этот вопрос будет что-то вроде этого:

а). Если хотите выбрать перед вставкой:

INSERT INTO Users( weight, desiredWeight ) 
  select val1 , val2  from tableXShoulatNotBeUsers
  WHERE somecondition;

б). Если запись уже существует, используйте обновление вместо вставки:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Должно быть

Update Users set weight=160, desiredWeight=145  WHERE id = 1;

с). Если вы хотите обновить или вставить одновременно

Replace Users set weight=160, desiredWeight=145  WHERE id = 1;

Note):- you should provide values to all fields else missed field in query 
        will be set to null

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

 create temporary table xtable ( weight int(11), desiredWeight int(11) ;

 insert into xtable (weight, desiredWeight) 
    select weight, desiredWeight from Users where [condition]

 insert into Users (weight, desiredWeight) 
    select weight , desiredWeight from xtable;

Я думаю, что это довольно охватывает большинство сценариев

2 голосов
/ 27 января 2009

Вставить в = Добавление строк в таблицу

Upate = обновить определенные строки.

Что бы описал пункт where в вашей вставке? Ничего не найдено, строка не существует (пока) ...

2 голосов
/ 11 августа 2012

ПРОЧИТАЙТЕ ЭТО ХОРОШО

Это не имеет смысла ... даже буквально

INSERT означает добавление new row, и когда вы говорите WHERE, вы определяете, о какой строке вы говорите, в SQL.

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

Вы должны выбрать один из следующих вариантов:

A. Используйте UPDATE вместо INSERT

B. Используйте INSERT и удалите предложение WHERE (я просто говорю ...), или если вы действительно обязаны использовать INSERT и WHERE в одном выражении, это можно сделать только через INSERT. .ВЫБРАТЬ предложение ...

INSERT INTO Users( weight, desiredWeight ) 
SELECT FROM Users WHERE id = 1;

Но это служит совершенно другой цели, и если вы определили id как Primary Key, эта вставка будет неудачной, в противном случае будет вставлена ​​новая строка с id = 1.

2 голосов
/ 09 августа 2012

Вы просто не можете использовать WHERE при выполнении оператора INSERT:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

должно быть:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );

Часть WHERE работает только в инструкциях SELECT:

SELECT from Users WHERE id = 1;

или в операторах UPDATE:

UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;
1 голос
/ 07 августа 2012

Может ли предложение WHERE фактически использоваться с INSERT-INTO-VALUES в любом случай

Ответ окончательно нет.

Добавление предложения WHERE после INSERT INTO ... VALUES ... является недопустимым SQL и не будет анализироваться.

MySQL возвращает ошибку:

mysql> INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
ERROR 1064 (42000): 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 'WHERE id = 1' at line 1

Наиболее важной частью сообщения об ошибке является

... syntax to use near 'WHERE id = 1' ...

, которая показывает конкретную часть, которую синтаксический анализатор не ожидал найти здесь: предложение WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...