Відповіді:
Синтаксис 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 як звичайного.
If you're trying to insert a new row with ID 1 you should be using
ВСТУПУЙТЕ ІНТО. У вашому випадку ви намагаєтеся вставити, коли ID 1 вже існує, і це первинний або унікальний ключ і не вдається, тож вам слід використовувати синтаксис UPDATE або ВСТАВИТИ. НА ДУПЛІКАЦІЙНІЙ КЛЮЧ синтаксис
Ви не можете поєднати пункт WHERE з пропозицією VALUES. Наскільки я знаю, у вас є два варіанти -
INSERT із зазначенням значень
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)
ВСТАВКА за допомогою оператора SELECT
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1
Ви використовуєте пункт WHERE для UPDATE запитів. Коли ВСТАВЛЯЄТЬСЯ, ви припускаєте, що рядок не існує.
Потім заява ОП стане;
ОНОВЛЕННЯ Користувачів SET вага = 160, бажанаВага = 45, де id = 1;
У MySQL, якщо ви хочете ВСТАВИТИ або ОНОВЛЮВАТИ, ви можете використовувати запит ЗАМІНИ з пунктом WHERE. Якщо ДЕ НЕ існує, ВСТАВЛЯЄТЬСЯ, інакше ОНОВЛЮЄ.
EDIT
Я думаю, що точка Білла Карвіна досить важлива, щоб вийти з коментарів і зробити це дуже очевидним. Дякую Біллу, вже дуже давно, як я працював з MySQL, я згадав, що у мене виникли проблеми із ЗАМІНЮЮ, але я забув, що це було. Я мав би це поглянути.
Ось так не працює ЗАМІНА MySQL. Вона робить DELETE (яка може бути неоперативною, якщо рядок не існує), після чого ВСТУП. Подумайте про наслідки, щодо. тригери та зовнішні ключові залежності. Натомість використовуйте ВСТАВИТИ ... НА ДУПЛІКАТНУ КЛЮЧУ ОНОВЛЕННЯ.
Умови застосовуються, оскільки ви можете використовувати там, де умова для операторів підбору вибору. Ви можете виконувати складні вставки за допомогою підбірки.
Наприклад:
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.
Наприклад, якщо у вас була таблиця з іменем клієнтів з первинним ключем 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);
Використання подвійної таблиці дозволяє вводити свої значення у вибраний оператор, навіть якщо значення наразі не зберігаються у таблиці.
Див. Також Як вставити пункт де
Правильна відповідь на це питання буде такою, що виглядає так:
а). ЯКЩО хочу вибрати перед вставкою:
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
г). Якщо ви хочете КЛІНАТИ запис із таблиці SAME, пам’ятайте, що ви не можете вибрати з таблиці, до якої ви вставляєте
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 на основі введення користувача. Цей запит буде вставлено лише у тому випадку, якщо введення vars '$ userWeight' та '$ userDesiredWeight' не порожні
INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Це залежить від ситуації, в якій INSERT може містити пункт де.
Наприклад, якщо ви співпадаєте із значеннями форми.
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 .
Якщо ви вказуєте певний запис "ні" для вставки даних, краще використовувати UPDATE
оператор замість INSERT
оператора.
Цей тип запиту, який ви написали у запитанні, схожий на фіктивний запит.
Ваш запит: -
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Тут ви вказуєте ідентифікатор = 1, так що краще використовувати UPDATE
заяву , щоб оновити існуючий record.It не рекомендується використовувати 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, тому що я не дуже впевнений, навіщо він вам потрібен.
Ви не повинні використовувати там, де умова у виписці Insert. Якщо ви хочете зробити це, використовуйте вкладиш у операторі оновлення, а потім оновіть існуючий запис.
Насправді я можу знати, для чого вам потрібен пункт де у виписці Insert ??
Можливо, виходячи з причини, я можу запропонувати вам кращий варіант.
Я думаю, що найкращим варіантом є використання ЗАМІНИ замість ВСТУП
ЗАМІНУЙТЕ У користувачів (id, вага, бажана вага) ЦІННОСТІ (1, 160, 145);
Це не має сенсу ... навіть буквально
INSERT
означає додати а, new row
і коли ви говорите, WHERE
ви визначаєте, про який рядок ви говорите в SQL
.
Тож додавання нового рядка неможливо із умовою в існуючий рядок.
Ви повинні вибрати з наступного:
А. Використовуйте UPDATE
замістьINSERT
B. Використовуйте INSERT
та видаліть WHERE
пункт (я просто говорю це ...) або якщо ви дійсно зобов'язані використовувати, INSERT
і WHERE
в одному заяві це можна зробити лише за допомогою INSERT..SELECT пункту ...
INSERT INTO Users( weight, desiredWeight )
SELECT FROM Users WHERE id = 1;
Але це служить зовсім іншому призначенню, і якщо ви визначили ідентифікатор як основний ключ, ця вставка буде невдалою, інакше буде вставлено новий рядок з id = 1.
Я знаю, що це старий пост, але я сподіваюся, що це все-таки допоможе комусь, і, надіюсь, це простий приклад:
фон:
У мене було багато-багато випадків: один і той же користувач перераховується кілька разів із кількома значеннями, і я хотів створити нову запис, отже UPDATE не мав би сенсу в моєму випадку, і мені потрібно було звертатися до певного користувача, як я б робив за допомогою пункту WHERE.
INSERT into MyTable(aUser,aCar)
value(User123,Mini)
Використовуючи цю конструкцію, ви насправді орієнтуєтесь на конкретного користувача (user123, у якого є інші записи), тому вам не дуже потрібний пункт де, я вважаю.
вихід може бути:
aUser aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
правильний синтаксис для вставки mysql в оператор методом post є:
$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
Я не думаю, що ми можемо використовувати там, де стаття в операторі insert
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 вам доведеться оновити таблицю.