Ответы:
Синтаксис 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 увеличивать его как обычно.
If you're trying to insert a new row with ID 1 you should be using
INSERT INTO. В вашем случае вы пытаетесь вставить, когда ID 1 уже существует, и это первичный или уникальный ключ, и не удается, поэтому вам следует использовать синтаксис UPDATE или INSERT .. ON DUPLICATE KEY синтаксис
Вы не можете комбинировать предложение WHERE с предложением VALUES. Насколько мне известно, у вас есть два варианта:
INSERT с указанием значений
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)
INSERT с помощью оператора SELECT
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1
Вы используете предложение 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.
Условия применяются, потому что вы можете использовать условие 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
Правильный ответ на этот вопрос будет примерно таким:
а). ЕСЛИ хотите выбрать перед вставкой:
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;
Я думаю, что это хорошо покрывает большинство сценариев
Вы просто не можете использовать 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;
Вы можете выполнить условную вставку INSERT на основе ввода пользователя. Этот запрос будет вставляться только в том случае, если входные переменные '$ userWeight' и '$ userDesiredWeight' не пустые.
INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Это зависит от ситуации, когда 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
Имеет смысл, не так ли?
Самый простой способ - использовать IF для нарушения ключевого ограничения. Это работает только для INSERT IGNORE, но позволит вам использовать ограничение в INSERT.
INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
После WHERE
предложения вы помещаете условие, и оно используется либо для выборки данных, либо для обновления строки. Когда вы вставляете данные, предполагается, что строка не существует.
Итак, вопрос в том, есть ли строка с идентификатором 1? в таком случае используйте MySQL UPDATE , иначе используйте MySQL INSERT .
Если вы указываете конкретную запись 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;
Может ли предложение 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.
Нет. Насколько мне известно, в этот запрос нельзя добавлять предложение WHERE. Возможно, я тоже забыл свой SQL, потому что я не совсем уверен, зачем он вам нужен.
Вы не должны использовать условие where в операторе Insert. Если хотите, используйте insert в операторе обновления, а затем обновите существующую запись.
На самом деле могу я знать, зачем вам нужно предложение where в операторе Insert ??
Может быть, исходя из причины, я мог бы предложить вам лучший вариант.
Я думаю, ваш лучший вариант - использовать REPLACE вместо INSERT
ЗАМЕНИТЬ НА Пользователи (идентификатор, вес, желаемый вес) ЗНАЧЕНИЯ (1, 160, 145);
Это не имеет смысла ... даже буквально
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.
Я знаю, что это старый пост, но я надеюсь, что это все равно кому-то поможет, и я надеюсь, что это простой пример:
задний план:
У меня было много и много случаев: один и тот же пользователь указан несколько раз с несколькими значениями, и я хотел создать новую запись, поэтому ОБНОВЛЕНИЕ не имело бы смысла в моем случае, и мне нужно было обратиться к конкретному пользователю так же, как и я. с помощью предложения WHERE.
INSERT into MyTable(aUser,aCar)
value(User123,Mini)
Используя эту конструкцию, вы на самом деле нацеливаетесь на конкретного пользователя (user123, у которого есть другие записи), поэтому, я полагаю, вам действительно не нужно предложение where.
вывод может быть:
aUser aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
Способ использования INSERT и WHERE
INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953);
В данном случае это не как exist-test. Нет исключения, если вы запустите его два или более раз ...
правильный синтаксис для mysql insert into statement с использованием метода post:
$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
Я не думаю, что мы можем использовать предложение where в операторе вставки
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
Я думаю, что правильная форма для вставки значения в указанную строку:
UPDATE table SET column = value WHERE columnid = 1
он работает, и аналогично, если вы пишете на Microsoft SQL Server
INSERT INTO table(column) VALUES (130) WHERE id = 1;
на mysql вам нужно обновить таблицу.