Odpowiedzi:
Składnia MySQL INSERT nie obsługuje klauzuli WHERE, więc zapytanie w obecnej postaci zakończy się niepowodzeniem. Zakładając, że Twoja id
kolumna jest unikatowa lub kluczem podstawowym:
Jeśli próbujesz wstawić nowy wiersz o identyfikatorze 1, powinieneś użyć:
INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);
Jeśli próbujesz zmienić wagę / pożądane wartości wagi dla istniejącego wiersza o identyfikatorze 1, powinieneś użyć:
UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;
Jeśli chcesz, możesz też użyć WSTAWIĆ .. W składni DUPLICATE KEY w następujący sposób:
INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
LUB nawet tak:
INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
Ważne jest również, aby pamiętać, że jeśli twoja id
kolumna jest kolumną z autoinkrementacją, równie dobrze możesz pominąć ją w INSERT i pozwolić mysql inkrementować ją jak zwykle.
If you're trying to insert a new row with ID 1 you should be using
INSERT INTO. W twoim przypadku próbujesz wstawić, gdy ID 1 już istnieje i jest to klucz podstawowy lub unikalny i kończy się niepowodzeniem, więc powinieneś użyć składni UPDATE lub INSERT .. W składni DUPLICATE KEY
Nie można łączyć klauzuli WHERE z klauzulą VALUES. O ile wiem, masz dwie opcje:
INSERT określając wartości
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)
INSERT przy użyciu instrukcji SELECT
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1
Klauzula WHERE jest używana do zapytań UPDATE. Kiedy WSTAWISZ, zakładasz, że wiersz nie istnieje.
Oświadczenie PO stałoby się wtedy;
UPDATE Użytkownicy SET waga = 160, pożądana waga = 45, gdzie id = 1;
W MySQL, jeśli chcesz INSERT lub UPDATE, możesz użyć zapytania REPLACE z klauzulą WHERE. Jeśli GDZIE nie istnieje, WSTAWIA, w przeciwnym razie AKTUALIZUJE.
EDYTOWAĆ
Myślę, że punkt widzenia Billa Karwina jest na tyle ważny, że można go wyrwać z komentarzy i uczynić go bardzo oczywistym. Dzięki Bill, minęło zbyt dużo czasu odkąd pracowałem z MySQL, przypomniałem sobie, że miałem problemy z REPLACE, ale zapomniałem, czym one są. Powinienem to sprawdzić.
Nie tak działa REPLACE MySQL. Wykonuje DELETE (co może oznaczać brak operacji, jeśli wiersz nie istnieje), po którym następuje INSERT. Pomyśl o konsekwencjach vis. wyzwalacze i zależności kluczy obcych. Zamiast tego użyj INSERT ... ON DUPLICATE KEY UPDATE.
Obowiązują warunki, ponieważ możesz użyć warunku where dla instrukcji wyboru podrzędnego. Możesz wykonywać skomplikowane wstawki za pomocą sub-selekcji.
Na przykład:
INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';
Umieszczając opcję „wybierz” w instrukcji wstawiania, można szybko wykonać wielokrotne wstawianie.
W przypadku tego typu wstawiania możesz chcieć sprawdzić liczbę wstawianych wierszy. Możesz określić liczbę wierszy, które zostaną wstawione, uruchamiając następującą instrukcję SQL przed wykonaniem wstawiania.
SELECT count(*)
FROM customers
WHERE city = 'Newark';
Możesz upewnić się, że nie wstawiasz zduplikowanych informacji, używając warunku EXISTS.
Na przykład, jeśli masz tabelę o nazwie klientów z kluczem podstawowym client_id, możesz użyć następującej instrukcji:
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);
Ta instrukcja wstawia wiele rekordów z podselekcją.
Jeśli chcesz wstawić pojedynczy rekord, możesz użyć następującej instrukcji:
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);
Użycie tabeli podwójnej umożliwia wprowadzenie wartości w instrukcji select, nawet jeśli wartości nie są obecnie przechowywane w tabeli.
Zobacz także Jak wstawiać z klauzulą where
Prawidłowa odpowiedź na to pytanie będzie wyglądać następująco:
za). JEŚLI chcesz wybrać przed wstawieniem:
INSERT INTO Users( weight, desiredWeight )
select val1 , val2 from tableXShoulatNotBeUsers
WHERE somecondition;
b). JEŚLI rekord już istnieje, użyj aktualizacji zamiast wstawiania:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Powinien być
Update Users set weight=160, desiredWeight=145 WHERE id = 1;
do). Jeśli chcesz zaktualizować lub wstawić w tym samym czasie
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
re). Jeśli chcesz SKLONOWAĆ rekord z TEJ SAMEJ tabeli, pamiętaj tylko, że nie możesz wybrać z tabeli, do której wstawiasz
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;
Myślę, że to całkiem pokrywa większość scenariuszy
Po prostu nie możesz użyć WHERE podczas wykonywania instrukcji INSERT:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Powinien być:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );
Część WHERE działa tylko w instrukcjach SELECT:
SELECT from Users WHERE id = 1;
lub w instrukcjach UPDATE:
UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;
Insert into = Dodawanie wierszy do tabeli
Upate = aktualizuj określone wiersze.
Co opisałaby klauzula Where w Twojej wstawce? Nie ma nic do dopasowania, wiersz nie istnieje (jeszcze) ...
Możesz wykonać warunkowe INSERT na podstawie danych wprowadzonych przez użytkownika. To zapytanie wstawi tylko wtedy, gdy zmienne wejściowe '$ userWeight' i '$ userDesiredWeight' nie są puste
INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Zależy to od sytuacji, w której INSERT może faktycznie mieć klauzulę where.
Na przykład, jeśli dopasowujesz wartości z formularza.
Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com
To ma sens, prawda?
Najprostszym sposobem jest użycie funkcji JEŻELI w celu naruszenia kluczowego ograniczenia. Działa to tylko dla INSERT IGNORE, ale pozwoli ci użyć ograniczenia w INSERT.
INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
Po WHERE
Klauzula umieszcza warunek, który jest używany do pobierania danych lub do aktualizowania wiersza. Podczas wstawiania danych zakłada się, że wiersz nie istnieje.
A więc pytanie brzmi, czy istnieje wiersz o identyfikatorze 1? jeśli tak, użyj MySQL UPDATE , w przeciwnym razie użyj MySQL INSERT .
Jeśli określasz konkretny rekord nie do wstawiania danych, lepiej jest użyć UPDATE
instrukcji zamiastINSERT
instrukcji.
Ten typ zapytania, które wpisałeś w pytaniu, jest jak zapytanie fikcyjne.
Twoje zapytanie to: -
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Tutaj UPDATE
określasz id = 1, więc lepiej użyj instrukcji do aktualizacji istniejącego rekordu.Nie zaleca się używania WHERE
klauzuli w przypadku INSERT
.UPDATE
.
Teraz korzystam z zapytania aktualizacyjnego: -
UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;
Czy w każdym przypadku klauzula WHERE może być faktycznie używana z INSERT-INTO-VALUES?
Odpowiedź brzmi: zdecydowanie nie.
Dodanie klauzuli WHERE po INSERT INTO ... VALUES ... jest po prostu nieprawidłowym kodem SQL i nie zostanie przeanalizowane.
Błąd zwracany przez MySQL to:
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
Najważniejszą częścią komunikatu o błędzie jest
... syntax to use near 'WHERE id = 1' ...
która pokazuje konkretną część, której parser nie spodziewał się znaleźć w tym miejscu: klauzula WHERE.
Nie. O ile wiem, nie możesz dodać klauzuli WHERE do tego zapytania. Może zapomniałem też o swoim SQL-u, ponieważ nie jestem pewien, dlaczego go potrzebujesz.
Nie należy używać warunku gdzie w instrukcji Wstaw. Jeśli chcesz, użyj wstawiania w instrukcji aktualizacji, a następnie zaktualizuj istniejący rekord.
Właściwie mogę wiedzieć, dlaczego potrzebujesz klauzuli gdzie w instrukcji wstawiania?
Może w oparciu o powód, mogę zasugerować lepszą opcję.
Myślę, że najlepszą opcją jest użycie REPLACE zamiast INSERT
ZAMIEŃ NA użytkowników (id, waga, pożądana waga) WARTOŚCI (1, 160, 145);
To nie ma sensu ... nawet dosłownie
INSERT
oznacza dodanie a, new row
a kiedy mówisz WHERE
, definiujesz, o którym wierszu mówisz w SQL
.
Dlatego dodanie nowego wiersza nie jest możliwe, jeśli warunek dotyczy istniejącego wiersza.
Masz do wyboru:
A. Użyj UPDATE
zamiastINSERT
B. Użyj INSERT
i usuń WHERE
klauzulę (właśnie to mówię ...) lub jeśli jesteś naprawdę zobowiązany do użycia INSERT
iw WHERE
pojedynczym oświadczeniu można to zrobić tylko za pomocą klauzuli INSERT..SELECT ...
INSERT INTO Users( weight, desiredWeight )
SELECT FROM Users WHERE id = 1;
Ale służy to zupełnie innemu celowi i jeśli zdefiniowałeś id jako klucz podstawowy, to wstawienie zakończy się niepowodzeniem, w przeciwnym razie zostanie wstawiony nowy wiersz z id = 1.
Zdaję sobie sprawę, że to stary post, ale mam nadzieję, że to jeszcze komuś pomoże, mam nadzieję, że jest to prosty przykład:
tło:
Miałem wiele do wielu przypadków: ten sam użytkownik jest wymieniony wiele razy z wieloma wartościami i chciałem utworzyć nowy rekord, dlatego UPDATE nie miałoby sensu w moim przypadku i musiałem zwrócić się do konkretnego użytkownika, tak jakbym zrobił używając klauzuli WHERE.
INSERT into MyTable(aUser,aCar)
value(User123,Mini)
Używając tej konstrukcji, w rzeczywistości kierujesz się na konkretnego użytkownika (user123, który ma inne rekordy), więc tak naprawdę nie potrzebujesz klauzuli where, tak sądzę.
wynikiem może być:
aUser aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
poprawna składnia wstawiania mysql do instrukcji przy użyciu metody post to:
$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
Nie sądzę, abyśmy mogli użyć klauzuli where w instrukcji wstawiania
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Nie możesz używać razem INSERT i WHERE. Możesz użyć klauzuli UPDATE, aby dodać wartość do określonej kolumny w określonym polu, jak poniżej;
UPDATE Users
SET weight='160',desiredWeight ='145'
WHERE id =1
Myślę, że prawidłową formą wstawiania wartości w określonym wierszu jest:
UPDATE table SET column = value WHERE columnid = 1
działa i jest podobnie, jeśli piszesz na serwerze Microsoft SQL Server
INSERT INTO table(column) VALUES (130) WHERE id = 1;
na mysql musisz zaktualizować tabelę.