MySQL Insert Where запрос


121

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

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

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

Ответы:


237

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

Если вы пытаетесь вставить новую строку с 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 увеличивать его как обычно.


1
Спасибо за хороший ответ. При использовании запроса UPDATE он работает нормально. Но если id является первичным ключом и ключом автоматического увеличения, то приведенный выше оператор INSERT не работает. Ошибка Повторяющаяся запись «1» для ключа 1.
JDGuide

1
@JDeveloper Это потому, что строка уже существует. Как упомянул Чад, If you're trying to insert a new row with ID 1 you should be usingINSERT INTO. В вашем случае вы пытаетесь вставить, когда ID 1 уже существует, и это первичный или уникальный ключ, и не удается, поэтому вам следует использовать синтаксис UPDATE или INSERT .. ON DUPLICATE KEY синтаксис
Энтони Хатзопулос

41

Вы не можете комбинировать предложение WHERE с предложением VALUES. Насколько мне известно, у вас есть два варианта:

  1. INSERT с указанием значений

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. INSERT с помощью оператора SELECT

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

19

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

Тогда заявление ОП станет;

ОБНОВЛЕНИЕ Пользователи установили вес = 160, желаемый вес = 45, где id = 1;

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

РЕДАКТИРОВАТЬ

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

MySQL REPLACE работает не так. Он выполняет DELETE (который может не выполняться, если строка не существует), за которым следует INSERT. Подумайте о последствиях vis. триггеры и зависимости внешнего ключа. Вместо этого используйте INSERT ... ON DUPLICATE KEY UPDATE.


7
MySQL REPLACE работает не так. Он выполняет DELETE (который может не выполняться, если строка не существует), за которым следует INSERT. Подумайте о последствиях vis. триггеры и зависимости внешнего ключа. Вместо этого используйте INSERT ... ON DUPLICATE KEY UPDATE.
Билл Карвин,


5

Вставить запрос не поддерживает ключевое слово where *

Условия применяются, потому что вы можете использовать условие 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.

Например, если у вас есть таблица с именем clients с первичным ключом 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

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

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

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;

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


3

Вы просто не можете использовать 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;

2

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

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

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


2

Вы можете выполнить условную вставку INSERT на основе ввода пользователя. Этот запрос будет вставляться только в том случае, если входные переменные '$ userWeight' и '$ userDesiredWeight' не пустые.

INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1

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

Например, если вы сопоставляете значения из формы.

Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com

Имеет смысл, не так ли?


возможно ли, где предложение в операторе вставки
Taja_100

1

Самый простой способ - использовать IF для нарушения ключевого ограничения. Это работает только для INSERT IGNORE, но позволит вам использовать ограничение в INSERT.

INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');

1

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

Итак, вопрос в том, есть ли строка с идентификатором 1? в таком случае используйте MySQL UPDATE , иначе используйте MySQL INSERT .


1

Если вы указываете конкретную запись no для вставки данных, лучше использовать UPDATEоператор вместо INSERTоператора.

Этот тип запроса, который вы написали в вопросе, похож на фиктивный запрос.

Ваш запрос: -

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

Здесь вы указываете id = 1, поэтому лучше использовать UPDATEоператор для обновления существующей записи. Не рекомендуется использовать WHEREпредложение в случае. INSERTВы должны использовать UPDATE.

Теперь используется запрос на обновление: -

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

Никакой ответный запрос не будет работать. Первый запрос - это вопрос.
JDGuide

Почему вы предлагаете обновление вместо вставки? Пользователь хочет вставить значения с условием и не обновлять существующие записи.
Сомнатх Мулук,

1

Может ли предложение 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.


1

это совершенно неправильно. INSERT QUERY не имеет предложения WHERE, оно есть только в UPDATE QUERY. Если вы хотите добавить данные, где id = 1, ваш запрос будет

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

1

Нет. Насколько мне известно, в этот запрос нельзя добавлять предложение WHERE. Возможно, я тоже забыл свой SQL, потому что я не совсем уверен, зачем он вам нужен.


1

Вы не должны использовать условие where в операторе Insert. Если хотите, используйте insert в операторе обновления, а затем обновите существующую запись.

На самом деле могу я знать, зачем вам нужно предложение where в операторе Insert ??

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


1

Я думаю, ваш лучший вариант - использовать REPLACE вместо INSERT

ЗАМЕНИТЬ НА Пользователи (идентификатор, вес, желаемый вес) ЗНАЧЕНИЯ (1, 160, 145);


1

ПРОЧИТАЙТЕ ЭТО ТАКЖЕ

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

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

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

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

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

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

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

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


да вы правы, зная все эти вещи будите делать ошибки.
Асеша Джордж

1

Я знаю, что это старый пост, но я надеюсь, что это все равно кому-то поможет, и я надеюсь, что это простой пример:

задний план:

У меня было много и много случаев: один и тот же пользователь указан несколько раз с несколькими значениями, и я хотел создать новую запись, поэтому ОБНОВЛЕНИЕ не имело бы смысла в моем случае, и мне нужно было обратиться к конкретному пользователю так же, как и я. с помощью предложения WHERE.

INSERT into MyTable(aUser,aCar)
value(User123,Mini)

Используя эту конструкцию, вы на самом деле нацеливаетесь на конкретного пользователя (user123, у которого есть другие записи), поэтому, я полагаю, вам действительно не нужно предложение where.

вывод может быть:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

1

Способ использования INSERT и WHERE

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); В данном случае это не как exist-test. Нет исключения, если вы запустите его два или более раз ...


0

правильный синтаксис для mysql insert into statement с использованием метода post:

$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";

1
Вам нужно избегать ненадежных параметров, таких как имя пользователя, или использовать параметризованные запросы, чтобы злоумышленник не вводил произвольные команды SQL . И используйте один из алгоритмов HashCrypt для хранения пароля.
Хендрик Бруммерманн,


0
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1
Можете ли вы отредактировать предложенный ответ, чтобы подробнее рассказать о том, что он делает и как он относится к OP?
Ро Йо Ми

0

Вы не можете использовать INSERT и WHERE вместе. Вы можете использовать предложение UPDATE для добавления значения в конкретный столбец в конкретном поле, как показано ниже;

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

0

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

UPDATE table SET column = value WHERE columnid = 1

он работает, и аналогично, если вы пишете на Microsoft SQL Server

INSERT INTO table(column) VALUES (130) WHERE id = 1;

на mysql вам нужно обновить таблицу.


0

Вы можете сделать это с помощью следующего кода:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.