24 ответов:
MySQL вставить синтаксис не поддерживает предложение WHERE, поэтому ваш запрос в его нынешнем виде не будет выполнен. Предполагая, что ваш
idстолбец является уникальным или первичным ключом:если вы пытаетесь вставить новую строку с id 1 Вы должны использовать:
INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);если вы пытаетесь изменить значения weight / desiredWeight для существующей строки с идентификатором 1, Вы должны использовать:
UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;если вы хотите, вы также можете использовать INSERT .. На повторяющийся синтаксис ключа, как Итак:
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столбец является столбцом автоинкремента, тогда вы можете также опустить его из своей вставки все вместе и позволить mysql увеличить его как обычно.
вы не можете объединить предложение WHERE с предложением VALUES. Насколько мне известно, у вас есть два варианта-
вставить указание значений
INSERT INTO Users(weight, desiredWeight) VALUES (160,145)вставить с помощью инструкции SELECT
INSERT INTO Users(weight, desiredWeight) SELECT weight, desiredWeight FROM AnotherTable WHERE id = 1
вы используете предложение WHERE для запросов на обновление. Когда вы вставляете, вы предполагаете, что строка не существует.
в MySQL, если вы хотите вставить или обновить, вы можете использовать запрос REPLACE с предложением WHERE. Если где не существует, он вставляет, в противном случае он обновляется.EDIT
Я думаю, что точка зрения Билла Карвина достаточно важна, чтобы вытащить из комментариев и сделать ее очень очевидной. Спасибо Билл, это было слишком долго, так как я работал с MySQL, я вспомнил, что у меня были проблемы с заменой, но я забыл, что они были. Я должен был посмотреть его.
это не так, как замена MySQL работает. Он выполняет удаление (которое может быть no-op, если строка не существует), а затем вставку. Подумайте о последствиях ВИС. триггеры и зависимости внешнего ключа. Вместо этого используйте INSERT...ПРИ ОБНОВЛЕНИИ ДУБЛИКАТА КЛЮЧА.
вставить запрос не поддерживает where ключевое слово*
условия применяются, потому что вы можете использовать условие where для операторов sub-select. Вы можете выполнять сложные вставки с помощью подзапросов.
например:
INSERT INTO suppliers (supplier_id, supplier_name) SELECT account_no, name FROM customers WHERE city = 'Newark';установив "select" в инструкции insert, вы можете быстро выполнять многократные вставки.
С помощью этого типа вставки вы можете проверить количество вставляемых строк. Вы можете определить количество строк, которые будет вставлен путем выполнения следующей инструкции 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);использование двойной таблицы позволяет вводить значения в инструкции select, даже если значения в настоящее время не хранятся в таблице.
см. также как вставить с предложением where
правильный ответ на этот вопрос будет sth следующим образом:
a). Если хотите выбрать перед вставкой:
INSERT INTO Users( weight, desiredWeight ) select val1 , val2 from tableXShoulatNotBeUsers WHERE somecondition;b). Если запись уже существует, используйте обновление вместо вставки:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;должно быть
Update Users set weight=160, desiredWeight=145 WHERE id = 1;c). Если вы хотите обновить или вставить одновременно
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 nulld). Если вы хотите клонировать запись из той же таблицы, просто помните, что вы не можете выбрать из таблицы, в которую вы вставляете поэтому
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;Я думаю, что это довольно охватывает большинство сценариев
вставить в = добавление строк в таблицу
обновление = Обновление конкретной строки.
Что бы предложение where описывало в вашей вставке? Он не имеет ничего, чтобы соответствовать, строка не существует (пока)...
вы просто не можете использовать 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 Users set (weight = 160, desiredWeight = 145) WHERE id = 1;
ПРОЧТИТЕ ЭТО ТАКЖЕ
это не имеет смысла... даже буквально
INSERTзначит добавитьnew rowи когда вы говоритеWHEREвы определяете, о какой строке вы говорите вSQL.таким образом, добавление новой строки невозможно с условием на существующей строке.
вы должны выбрать один из следующих вариантов:
Используйте
UPDATEвместоINSERTB. Использование
INSERTи удалитьWHEREпункт ( я просто говорю это...) или если вы действительно обязаны использоватьINSERTиWHEREв одном заявлении это может быть сделано только через вставить..Выберите пункт...INSERT INTO Users( weight, desiredWeight ) SELECT FROM Users WHERE id = 1;но это служит совершенно другой цели, и если вы определили id как первичный ключ, эта вставка будет неудачной, иначе новая строка будет вставлена с id = 1.
Это зависит от ситуации вставка может иметь предложение where.
например, если вы сопоставляете значения из формы.
Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,[email protected],160,145) WHERE name != fred AND email != [email protected]имеет смысл, не правда ли?
самый простой способ-использовать, если нарушить ваше ключевое ограничение. Это работает только для вставки игнорировать, но позволит вам использовать ограничение в вставке.
INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
после
WHEREпредложение вы ставите условие, и оно используется либо для извлечения данных, либо для обновления строки. При вставке данных предполагается, что строка не существует.Итак, вопрос, есть ли строки с id 1? если да, то используйте обновление MySQL, еще использовать MySQL INSERT.
если вы указываете конкретную запись нет для вставки данных его лучше использовать
UPDATEзаявление вместоINSERTзаявление.этот тип запроса, который вы написали в вопросе, похож на фиктивный запрос.
ваш запрос :-
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;здесь вы указываете id=1, поэтому лучше использовать
UPDATEоператор для обновления существующего record.It не рекомендуется использоватьWHEREпункт в случаеINSERT.Вы должны использоватьUPDATE.Теперь С Помощью Запроса На Обновление: -
UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;
действительно ли where-предложение может использоваться с INSERT-INTO-VALUES в любом случае?
ответ однозначно нет.
добавление предложения WHERE после INSERT INTO ... ЦЕННОСТИ... это просто недопустимый 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.
это совершенно неправильно. Запрос INSERT не имеет предложения WHERE, только запрос UPDATE имеет его. Если вы хотите добавить данные, где id = 1, то ваш запрос будет
UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;
нет. Насколько мне известно, вы не можете добавить предложение WHERE в этот запрос. Может быть, я тоже забыл свой SQL, потому что я не совсем уверен, зачем вам это нужно.
вы не должны использовать условие where в инструкции Insert. Если вы хотите это сделать, используйте insert в инструкции update, а затем обновите существующую запись.
на самом деле я могу знать, зачем вам нужно предложение where в инструкции Insert??
может быть, на основе причины я мог бы предложить вам лучший вариант.
Я думаю, что ваш лучший вариант - использовать REPLACE вместо INSERT
заменить в Пользователей (id, вес, желаемый вес) значения(1, 160, 145);
вы можете сделать условную вставку на основе пользовательского ввода. Этот запрос будет вставлять только если входные vars '$userWeight ' и '$userDesiredWeight ' не являются пустыми
INSERT INTO Users(weight, desiredWeight ) select '$userWeight', '$userDesiredWeight' FROM (select 1 a ) dummy WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Я знаю, что это старый пост, но я надеюсь, что это все еще поможет кому-то, с чем я надеюсь, это простой пример:
справочная информация:
у меня было много для многих случаев: один и тот же пользователь указан несколько раз с несколькими значениями, и я хотел создать новую запись, поэтому обновление не имело бы смысла в моем случае, и мне нужно было обратиться к конкретному пользователю так же, как я бы сделал, используя предложение WHERE.
INSERT into MyTable(aUser,aCar) value(User123,Mini)С помощью этой конструкции вы на самом деле целевой конкретный пользователь (user123,у которого есть другие записи), поэтому вам действительно не нужно предложение where, я считаю.
выход может быть:
aUser aCar user123 mini user123 HisOtherCarThatWasThereBefore
правильный синтаксис для mysql вставить в инструкцию с помощью метода post является:
$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
INSERT INTO Users(weight, desiredWeight ) SELECT '$userWeight', '$userDesiredWeight' FROM (select 1 a ) dummy WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
вы не можете использовать INSERT и WHERE вместе. Вы можете использовать предложение UPDATE для добавления значения в определенный столбец в определенном поле, как показано ниже кода;
UPDATE Users SET weight='160',desiredWeight ='145' WHERE id =1
Comments