Câu trả lời:
MySQL INSERT Syntax không hỗ trợ mệnh đề WHERE vì vậy truy vấn của bạn khi nó đứng sẽ không thành công. Giả sử id
cột của bạn là duy nhất hoặc khóa chính:
Nếu bạn đang cố gắng chèn một hàng mới với ID 1, bạn nên sử dụng:
INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);
Nếu bạn đang cố gắng thay đổi giá trị trọng lượng / trọng lượng mong muốn cho hàng hiện có có ID 1, bạn nên sử dụng:
UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;
Nếu bạn muốn, bạn cũng có thể sử dụng INSERT .. ON DUPLICATE KEY cú pháp như sau:
INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
HOẶC thậm chí như vậy:
INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
Điều quan trọng cần lưu ý là nếu id
cột của bạn là cột tự động tăng thì bạn cũng có thể loại bỏ nó khỏi CHÈN cùng nhau và để mysql tăng như bình thường.
If you're trying to insert a new row with ID 1 you should be using
INSERT INTO. Trong trường hợp của bạn, bạn đang cố gắng để chèn khi ID 1 đã tồn tại và nó là một khóa chính hoặc duy nhất và thất bại, do đó bạn nên sử dụng một trong hai cú pháp UPDATE hay cú pháp INSERT .. ON DUPLICATE KEY
Bạn không thể kết hợp mệnh đề WHERE với mệnh đề GIÁ TRỊ. Bạn có hai lựa chọn theo như tôi biết-
INSERT xác định giá trị
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)
CHÈN bằng câu lệnh CHỌN
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1
Bạn sử dụng mệnh đề WHERE cho các truy vấn CẬP NHẬT. Khi bạn CHÈN, bạn đang giả định rằng hàng không tồn tại.
Tuyên bố của OP sau đó sẽ trở thành;
CẬP NHẬT Người dùng SET weight = 160, mong muốnWeight = 45 trong đó id = 1;
Trong MySQL, nếu bạn muốn CHÈN hoặc CẬP NHẬT, bạn có thể sử dụng truy vấn REPLACE với mệnh đề WHERE. Nếu WHERE không tồn tại, nó INSERTS, nếu không nó UPDATES.
BIÊN TẬP
Tôi nghĩ rằng quan điểm của Bill Karwin đủ quan trọng để rút ra khỏi các bình luận và làm cho nó rất rõ ràng. Cảm ơn Bill, đã quá lâu kể từ khi tôi làm việc với MySQL, tôi nhớ rằng tôi đã gặp sự cố với REPLACE, nhưng tôi đã quên chúng là gì. Tôi lẽ ra nên tra cứu nó.
Đó không phải là cách REPLACE của MySQL hoạt động. Nó thực hiện một XÓA (có thể là cấm nếu hàng không tồn tại), theo sau là CHÈN. Hãy nghĩ đến hậu quả của nó. trình kích hoạt và phụ thuộc khóa ngoại. Thay vào đó, hãy sử dụng INSERT ... ON DUPLICATE KEY UPDATE.
Điều kiện áp dụng vì bạn có thể sử dụng điều kiện where cho các câu lệnh chọn con. Bạn có thể thực hiện các thao tác chèn phức tạp bằng cách sử dụng các lựa chọn phụ.
Ví dụ:
INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';
Bằng cách đặt "select" trong câu lệnh chèn, bạn có thể thực hiện chèn bội số một cách nhanh chóng.
Với kiểu chèn này, bạn có thể muốn kiểm tra số hàng đang được chèn. Bạn có thể xác định số hàng sẽ được chèn bằng cách chạy câu lệnh SQL sau trước khi thực hiện chèn.
SELECT count(*)
FROM customers
WHERE city = 'Newark';
Bạn có thể đảm bảo rằng bạn không chèn thông tin trùng lặp bằng cách sử dụng điều kiện TỒN TẠI.
Ví dụ: nếu bạn có một bảng có tên là khách hàng với khóa chính là client_id, bạn có thể sử dụng câu lệnh sau:
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);
Câu lệnh này chèn nhiều bản ghi với một lựa chọn con.
Nếu bạn muốn chèn một bản ghi, bạn có thể sử dụng câu lệnh sau:
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);
Việc sử dụng bảng kép cho phép bạn nhập các giá trị của mình vào một câu lệnh chọn, ngay cả khi các giá trị hiện không được lưu trữ trong bảng.
Xem thêm Cách chèn mệnh đề where
Câu trả lời đúng cho câu hỏi này sẽ là như thế này:
a). NẾU muốn chọn trước khi chèn:
INSERT INTO Users( weight, desiredWeight )
select val1 , val2 from tableXShoulatNotBeUsers
WHERE somecondition;
b). Bản ghi NẾU đã tồn tại, hãy sử dụng cập nhật thay vì chèn:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Nên là
Update Users set weight=160, desiredWeight=145 WHERE id = 1;
c). Nếu bạn muốn cập nhật hoặc chèn cùng một lú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 null
d). Nếu bạn muốn CLONE một bản ghi từ CÙNG bảng, chỉ cần nhớ rằng bạn không thể chọn từ bảng mà bạn đang chèn vào đó
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;
Tôi nghĩ điều này khá phù hợp với hầu hết các tình huống
Bạn không thể sử dụng WHERE khi thực hiện câu lệnh INSERT:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
nên là:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );
Phần WHERE chỉ hoạt động trong các câu lệnh SELECT:
SELECT from Users WHERE id = 1;
hoặc trong câu lệnh UPDATE:
UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;
Bạn có thể thực hiện CHÈN có điều kiện dựa trên đầu vào của người dùng. Truy vấn này sẽ chỉ chèn nếu các vars đầu vào '$ userWeight' và '$ userDesosystemWeight' không trống
INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Nó phụ thuộc vào tình huống INSERT thực sự có thể có một mệnh đề where.
Ví dụ: nếu bạn đang khớp các giá trị từ một biểu mẫu.
Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com
Có ý nghĩa phải không?
Cách đơn giản nhất là sử dụng IF để vi phạm ràng buộc khóa của bạn. Điều này chỉ hoạt động cho CHÈN BỎ QUA nhưng sẽ cho phép bạn sử dụng ràng buộc trong một CHÈN.
INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
Sau WHERE
mệnh đề bạn đặt một điều kiện và nó được sử dụng để tìm nạp dữ liệu hoặc để cập nhật một hàng. Khi bạn đang chèn dữ liệu, nó được giả định rằng hàng không tồn tại.
Vì vậy, câu hỏi đặt ra là có hàng nào có id là 1 không? nếu vậy, hãy sử dụng MySQL UPDATE , nếu không, hãy sử dụng MySQL INSERT .
Nếu bạn đang chỉ định một bản ghi cụ thể không để chèn dữ liệu, tốt hơn hết bạn nên sử dụng UPDATE
câu lệnh thay vì INSERT
câu lệnh.
Loại truy vấn bạn đã viết trong câu hỏi giống như một truy vấn giả.
Truy vấn của bạn là: -
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Ở đây, bạn đang chỉ định id = 1, vì vậy tốt hơn bạn nên sử dụng UPDATE
câu lệnh để cập nhật bản ghi hiện có . Bạn không nên sử dụng WHERE
mệnh đề trong trường hợp INSERT
. Bạn nên sử dụng UPDATE
.
Hiện đang sử dụng truy vấn cập nhật: -
UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;
Mệnh đề WHERE thực sự có thể được sử dụng với INSERT-INTO-VALUES trong mọi trường hợp không?
Câu trả lời chắc chắn là không.
Thêm mệnh đề WHERE sau khi CHÈN VÀO ... GIÁ TRỊ ... chỉ là SQL không hợp lệ và sẽ không phân tích cú pháp.
Lỗi do MySQL trả về là:
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
Phần quan trọng nhất của thông báo lỗi là
... syntax to use near 'WHERE id = 1' ...
cho thấy phần cụ thể mà trình phân tích cú pháp không mong đợi tìm thấy ở đây: mệnh đề WHERE.
Không. Theo như tôi biết, bạn không thể thêm mệnh đề WHERE vào truy vấn này. Có lẽ tôi cũng đã quên SQL của mình, vì dù sao thì tôi cũng không thực sự chắc chắn tại sao bạn lại cần nó.
Bạn không nên sử dụng điều kiện where trong câu lệnh Insert. Nếu bạn muốn làm như vậy, hãy sử dụng chèn trong câu lệnh cập nhật và sau đó cập nhật bản ghi hiện có.
Trên thực tế, tôi có thể biết tại sao bạn cần một mệnh đề where trong câu lệnh Chèn ??
Có thể dựa trên lý do tôi có thể gợi ý cho bạn một lựa chọn tốt hơn.
Tôi nghĩ lựa chọn tốt nhất của bạn là sử dụng REPLACE thay vì INSERT
THAY THẾ VÀO Người dùng (id, trọng lượng, trọng lượng mong muốn) CÁC GIÁ TRỊ (1, 160, 145);
Nó không có ý nghĩa ... ngay cả theo nghĩa đen
INSERT
nghĩa là thêm một new row
và khi bạn nói, WHERE
bạn xác định hàng mà bạn đang nói đến trongSQL
.
Vì vậy, không thể thêm một hàng mới với một điều kiện trên một hàng hiện có.
Bạn phải chọn từ những thứ sau:
A. Sử dụng UPDATE
thay vìINSERT
B. Sử dụng INSERT
và loại bỏ WHERE
mệnh đề (Tôi chỉ đang nói nó ...) hoặc nếu bạn thực sự bị ràng buộc phải sử dụng INSERT
và WHERE
trong một câu lệnh duy nhất, nó có thể được thực hiện chỉ thông qua mệnh đề INSERT..SELECT ...
INSERT INTO Users( weight, desiredWeight )
SELECT FROM Users WHERE id = 1;
Nhưng điều này phục vụ một mục đích hoàn toàn khác và nếu bạn đã xác định id là Khóa chính thì việc chèn này sẽ không thành công, nếu không, một hàng mới sẽ được chèn với id = 1.
Tôi biết rằng đây là một bài đăng cũ nhưng tôi hy vọng rằng điều này vẫn sẽ giúp ích cho ai đó, với những gì tôi hy vọng là một ví dụ đơn giản:
lý lịch:
Tôi đã gặp nhiều trường hợp: cùng một người dùng được liệt kê nhiều lần với nhiều giá trị và tôi muốn Tạo bản ghi mới, do đó CẬP NHẬT sẽ không có ý nghĩa trong trường hợp của tôi và tôi cần phải giải quyết một người dùng cụ thể giống như tôi sẽ làm sử dụng mệnh đề WHERE.
INSERT into MyTable(aUser,aCar)
value(User123,Mini)
Bằng cách sử dụng cấu trúc này, bạn thực sự nhắm mục tiêu đến một người dùng cụ thể (user123, người có các bản ghi khác) nên bạn không thực sự cần mệnh đề where, tôi nghĩ.
đầu ra có thể là:
aUser aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
cú pháp đúng cho câu lệnh chèn mysql vào sử dụng phương thức post là:
$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
tôi không nghĩ rằng chúng ta có thể sử dụng mệnh đề where trong câu lệnh insert
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Bạn không thể sử dụng INSERT và WHERE cùng nhau. Bạn có thể sử dụng mệnh đề CẬP NHẬT để thêm giá trị vào cột cụ thể trong trường cụ thể như mã dưới đây;
UPDATE Users
SET weight='160',desiredWeight ='145'
WHERE id =1
Tôi nghĩ rằng hình thức chính xác để chèn giá trị trên một hàng chỉ định là:
UPDATE table SET column = value WHERE columnid = 1
nó hoạt động và tương tự nếu bạn viết trên Microsoft SQL Server
INSERT INTO table(column) VALUES (130) WHERE id = 1;
trên mysql bạn phải Cập nhật bảng.