MySQL Insert Де запит


121

Що не так у цьому запиті:

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

Це працює без WHEREпункту. Я, здається, забув свій SQL ..

Відповіді:


237

Синтаксис 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 як звичайного.


1
Дякую за гарну відповідь. При використанні UPDATE запит спрацьовує. Але, коли id є первинним ключем та ключем автоматичного збільшення, то вищевказаний оператор INSERT не працює. Помилка дублювання запису "1" для ключа 1.
JDGuide

1
@JDeveloper Це тому, що рядок вже існує. Як згадував Чад, If you're trying to insert a new row with ID 1 you should be usingВСТУПУЙТЕ ІНТО. У вашому випадку ви намагаєтеся вставити, коли ID 1 вже існує, і це первинний або унікальний ключ і не вдається, тож вам слід використовувати синтаксис UPDATE або ВСТАВИТИ. НА ДУПЛІКАЦІЙНІЙ КЛЮЧ синтаксис
Anthony Hatzopoulos

41

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

  1. INSERT із зазначенням значень

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
    
  2. ВСТАВКА за допомогою оператора SELECT

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

19

Ви використовуєте пункт WHERE для UPDATE запитів. Коли ВСТАВЛЯЄТЬСЯ, ви припускаєте, що рядок не існує.

Потім заява ОП стане;

ОНОВЛЕННЯ Користувачів SET вага = 160, бажанаВага = 45, де id = 1;

У MySQL, якщо ви хочете ВСТАВИТИ або ОНОВЛЮВАТИ, ви можете використовувати запит ЗАМІНИ з пунктом WHERE. Якщо ДЕ НЕ існує, ВСТАВЛЯЄТЬСЯ, інакше ОНОВЛЮЄ.

EDIT

Я думаю, що точка Білла Карвіна досить важлива, щоб вийти з коментарів і зробити це дуже очевидним. Дякую Біллу, вже дуже давно, як я працював з MySQL, я згадав, що у мене виникли проблеми із ЗАМІНЮЮ, але я забув, що це було. Я мав би це поглянути.

Ось так не працює ЗАМІНА MySQL. Вона робить DELETE (яка може бути неоперативною, якщо рядок не існує), після чого ВСТУП. Подумайте про наслідки, щодо. тригери та зовнішні ключові залежності. Натомість використовуйте ВСТАВИТИ ... НА ДУПЛІКАТНУ КЛЮЧУ ОНОВЛЕННЯ.


7
Ось так не працює ЗАМІНА MySQL. Вона робить DELETE (яка може бути неоперативною, якщо рядок не існує), після чого ВСТУП. Подумайте про наслідки, щодо. тригери та зовнішні ключові залежності. Натомість використовуйте ВСТАВИТИ ... НА ДУПЛІКАТНУ КЛЮЧУ ОНОВЛЕННЯ.
Білл Карвін


5

Вставити запит не підтримує, де ключове слово *

Умови застосовуються, оскільки ви можете використовувати там, де умова для операторів підбору вибору. Ви можете виконувати складні вставки за допомогою підбірки.

Наприклад:

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);

Використання подвійної таблиці дозволяє вводити свої значення у вибраний оператор, навіть якщо значення наразі не зберігаються у таблиці.

Див. Також Як вставити пункт де


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

г). Якщо ви хочете КЛІНАТИ запис із таблиці 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;

Я думаю, що це досить охоплює більшість сценаріїв


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 = оновити конкретні рядки.

Що б в описі описував пункт де? У ньому немає нічого відповідного, рядок не існує (поки що) ...


2

Ви можете робити умовні INSERT на основі введення користувача. Цей запит буде вставлено лише у тому випадку, якщо введення vars '$ userWeight' та '$ userDesiredWeight' не порожні

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

1

Це залежить від ситуації, в якій INSERT може містити пункт де.

Наприклад, якщо ви співпадаєте із значеннями форми.

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

Якщо ви вказуєте певний запис "ні" для вставки даних, краще використовувати 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;

Жоден mate.1st запит не буде працювати. Перший запит - це запитання.
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

його все неправильно. ВСТАВКА QUERY не має пункту WHERE, лише оновлення QUERY має його. Якщо ви хочете додати дані де id = 1, ваш запит буде

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

1

Ні. Наскільки мені відомо, ви не можете додати пункт WHERE до цього запиту. Можливо, я теж забув свій SQL, тому що я не дуже впевнений, навіщо він вам потрібен.


1

Ви не повинні використовувати там, де умова у виписці Insert. Якщо ви хочете зробити це, використовуйте вкладиш у операторі оновлення, а потім оновіть існуючий запис.

Насправді я можу знати, для чого вам потрібен пункт де у виписці Insert ??

Можливо, виходячи з причини, я можу запропонувати вам кращий варіант.


1

Я думаю, що найкращим варіантом є використання ЗАМІНИ замість ВСТУП

ЗАМІНУЙТЕ У користувачів (id, вага, бажана вага) ЦІННОСТІ (1, 160, 145);


1

ЧИТАЙТЕ ЦЕ ДОБРО

Це не має сенсу ... навіть буквально

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.


так, ви правильні, знаючи, що всі ці речі прокидаються, роблять помилки.
Асеша Георгій

1

Я знаю, що це старий пост, але я сподіваюся, що це все-таки допоможе комусь, і, надіюсь, це простий приклад:

фон:

У мене було багато-багато випадків: один і той же користувач перераховується кілька разів із кількома значеннями, і я хотів створити нову запис, отже UPDATE не мав би сенсу в моєму випадку, і мені потрібно було звертатися до певного користувача, як я б робив за допомогою пункту WHERE.

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

Використовуючи цю конструкцію, ви насправді орієнтуєтесь на конкретного користувача (user123, у якого є інші записи), тому вам не дуже потрібний пункт де, я вважаю.

вихід може бути:

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); У цьому випадку це як тест існування. Не є винятком, якщо ви запускаєте його два і більше разів ...


0

правильний синтаксис для вставки mysql в оператор методом 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
Чи можете ви відредагувати запропоновану відповідь, щоб розширити, що це робить і як вона стосується ОП?
Ro Yo Mi

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.