MySQL Chèn truy vấn ở đâu


121

Có gì sai với truy vấn này:

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

Nó hoạt động mà không cần WHEREmệnh đề. Tôi dường như đã quên SQL của mình ..

Câu trả lời:


237

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ử idcộ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 idcộ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.


1
Cảm ơn vì một câu trả lời tốt. Khi sử dụng UPDATE, truy vấn của nó hoạt động tốt. Tuy nhiên, khi id là chìa khóa & increment tự động khóa chính thì trên câu lệnh INSERT không phải là work.Error Duplicate entry '1' cho khóa 1.
JDGuide

1
@JDeveloper Đó là vì hàng đã tồn tại. Như Chad đã đề cập If you're trying to insert a new row with ID 1 you should be usingINSERT 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
Anthony Hatzopoulos

41

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-

  1. INSERT xác định giá trị

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. CHÈN bằng câu lệnh CHỌN

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

19

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.


7
Đó 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.
Bill Karwin

10

Tôi không tin rằng phụ trang có mệnh đề WHERE.


Đó là sự thật và cát tường cùng thời gian!
Ingus

5

Chèn truy vấn không hỗ trợ từ khóa where *

Đ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


4

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


3

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;

2

Chèn vào = Thêm hàng vào bảng

Upate = cập nhật các hàng cụ thể.

Mệnh đề where sẽ mô tả trong phụ trang của bạn là gì? Nó không có bất kỳ thứ gì để khớp, hàng không tồn tại (chưa) ...


2

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'!='';

1

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?


là nó có thể mệnh đề where trong bản Tuyên Bố chèn
Taja_100

1

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

1

Sau WHEREmệ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 .


1

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 UPDATEcâu lệnh thay vì INSERTcâ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 UPDATEcâu lệnh để cập nhật bản ghi hiện có . Bạn không nên sử dụng WHEREmệ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;

Không có truy vấn mate.1st sẽ không hoạt động. Truy vấn thứ nhất là câu hỏi được hỏi.
JDGuide

Tại sao bạn đề xuất cập nhật hơn chèn? Người dùng muốn chèn các giá trị với điều kiện và không cập nhật các bản ghi đang thoát.
Somnath Muluk

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.


1

nó hoàn toàn sai. INSERT QUERY không có mệnh đề WHERE, Chỉ UPDATE QUERY mới có mệnh đề đó. Nếu bạn muốn thêm dữ liệu Trong đó id = 1 thì Truy vấn của bạn sẽ

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

1

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ó.


1

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.


1

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


1

HÃY ĐỌC NHƯ THẾ NÀY

Nó không có ý nghĩa ... ngay cả theo nghĩa đen

INSERTnghĩa là thêm một new rowvà khi bạn nói, WHEREbạ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 UPDATEthay vìINSERT

B. Sử dụng INSERTvà loại bỏ WHEREmệ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 INSERTWHEREtrong 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.


vâng của bạn là đúng, biết tất cả những điều này thức dậy sai lầm.
Asesha George

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

1

Một cách để sử dụng INSERT và WHERE là

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); Trong trường hợp này, nó giống như một bài kiểm tra tồn tại. Không có ngoại lệ nếu bạn chạy nó hai lần trở lên ...


0

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]')";

1
Bạn cần thoát các tham số không đáng tin cậy như tên người dùng hoặc sử dụng các truy vấn được tham số hóa để ngăn kẻ tấn công đưa vào các lệnh SQL tùy ý . Và sử dụng một trong các thuật toán HashCrypt để lưu trữ mật khẩu.
Hendrik Brummermann

0

tôi không nghĩ rằng chúng ta có thể sử dụng mệnh đề where trong câu lệnh insert


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

1
Bạn có thể chỉnh sửa câu trả lời đề xuất của mình để mở rộng điều này có tác dụng gì và cách nó giải quyết OP không?
Ro Yo Mi

0

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

0

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.


0

Bạn có thể làm điều đó với mã dưới đây:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.