Cập nhật mysql và trả lại hàng
Có thể có một yêu cầu trong đó dữ liệu hiện có trong bảng MySQL cần được sửa đổi. Bạn có thể làm như vậy bằng cách sử dụng lệnh SQL UPDATE. Điều này sẽ sửa đổi bất kỳ giá trị trường nào của bất kỳ bảng MySQL nào Show
cú phápKhối mã sau đây có cú pháp SQL chung của lệnh CẬP NHẬT để sửa đổi dữ liệu trong bảng MySQL - UPDATE table_name SET field1 = new-value1, field2 = new-value2 [WHERE Clause]
Mệnh đề WHERE rất hữu ích khi bạn muốn cập nhật các hàng đã chọn trong bảng Cập nhật dữ liệu từ Command PromptĐiều này sẽ sử dụng lệnh SQL UPDATE với mệnh đề WHERE để cập nhật dữ liệu đã chọn trong bảng MySQL tutorials_tbl Ví dụVí dụ sau sẽ cập nhật trường tutorial_title cho một bản ghi có tutorial_id là 3 root@host# mysql -u root -p password; Enter password:******* mysql> use TUTORIALS; Database changed mysql> UPDATE tutorials_tbl -> SET tutorial_title = 'Learning JAVA' -> WHERE tutorial_id = 3; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> Cập nhật dữ liệu bằng PHP ScriptPHP sử dụng hàm mysqli query() hoặc mysql_query() để cập nhật các bản ghi trong bảng MySQL. Hàm này nhận hai tham số và trả về TRUE nếu thành công hoặc FALSE nếu thất bại cú pháp$mysqli->query($sql,$resultmode)Sr. KHÔNG. Tham số & Mô tả1 $sql Bắt buộc - Truy vấn SQL để cập nhật bản ghi trong bảng MySQL 2$resultmode Tùy chọn - Hằng số MYSQLI_USE_RESULT hoặc MYSQLI_STORE_RESULT tùy thuộc vào hành vi mong muốn. Theo mặc định, MYSQLI_STORE_RESULT được sử dụng Ví dụHãy thử ví dụ sau để cập nhật một bản ghi trong bảng - Sao chép và dán ví dụ sau vào mysql_example. php − Updating MySQL Table connect_errno ) { printf("Connect failed: %s đầu raTruy cập mysql_example. php được triển khai trên máy chủ web apache và xác minh đầu ra. Ở đây chúng tôi đã nhập nhiều bản ghi vào bảng trước khi chạy tập lệnh chọn
Trong hai phần trước của loạt bài này, bạn đã tìm hiểu về SELECT và INSERT, hai câu lệnh ngôn ngữ thao tác dữ liệu (DML) quan trọng trong MySQL. Trong bài viết này, tôi tập trung vào câu lệnh UPDATE, một câu lệnh DML có giá trị khác trong MySQL Bài viết này là một phần trong loạt bài tiếp theo của Robert Sheldon về Học MySQL. Để xem tất cả 11 mục trong sê-ri, hãy nhấp vào đây Câu lệnh Chuẩn bị môi trường MySQL của bạnĐối với các ví dụ trong bài viết này, tôi đã sử dụng cùng một cơ sở dữ liệu (_______9_______) và các bảng ( Ghi chú. Các ví dụ giả định rằng bạn đã làm việc trong bài viết trước, trong trường hợp đó, cơ sở dữ liệu Để thiết lập cơ sở dữ liệu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 TẠO BẢNG nhà sản xuất ( manufacturer_id INT CHƯA KÝ KHÔNG NULL AUTO_INCREMENT, nhà sản xuất VARCHAR(50) NOT NULL, create_date DẤU THỜI GIAN NOT NULL DEFAULT CURRENT_TIMESTAMP, last_update DẤU THỜI GIAN NOT NULL MẶC ĐỊNH CURRENT_TIMESTAMP BẬT CẬP NHẬT CURRENT_TIMESTAMP, CHÍNH CHÍNH KEY (manufacturer_id) ) ENGINE=InnoDB AUTO_INCREMENT=1001;
TẠO BẢNG máy bay ( plane_id INT KHÔNG ĐƯỢC KÝ KHÔNG NULL AUTO_INCREMENT, máy bay VARCHAR(50) NOT NULL, manufacturer_id INT CHƯA KÝ KHÔNG NULL, engine_type VARCHAR(50) NOT NULL, engine_count TINYINT NOT NULL, max_weight VỪA KHÔNG ĐƯỢC KÝ KHÔNG NULL, sải cánh THẬP PHÂN(5,2) NOT NULL, plane_length DECIMAL(5,2) NOT NULL, parking_area INT ĐƯỢC TẠO LUÔN LUÔN AS ((sải cánh * plane_length)) STORED, icao_code CHAR(4) NOT NULL, create_date DẤU THỜI GIAN NOT NULL MẶC ĐỊNH CURRENT_TIMESTAMP, last_update DẤU THỜI GIAN NOT NULL MẶC ĐỊNH CURRENT_TIMESTAMP BẬT CẬP NHẬT CURRENT_TIMESTAMP, CHÍNH CHÍNH KEY (plane_id), HÀNG CHẾ fk_manufacturer_id NGOẠI NGOẠI KEY (manufacturer_id) TÀI LIỆU THAM KHẢO nhà sản xuất (manufacturer_id) ) ENGINE=InnoDB AUTO_INCREMENT=101; Tiếp theo, bạn cần thêm dữ liệu vào bảng 1 2 3 4 5 6 CHÈN VÀO nhà sản xuất (nhà sản xuất) GIÁ TRỊ ('Beagle Aircraft Limited');
CHỌN manufacturer_id TỪ nhà sản xuất Ở ĐÂU nhà sản xuất = 'Beagle Aircraft Limited'<; Sau khi dữ liệu được chèn vào, câu lệnh SELECT trả về giá trị mới được thêm vào từ cột 1 2 3 4 5 6 7 8 9 CHÈN VÀO máy bay (máy bay, manufacturer_id, engine_type, engine_count, sải cánh, chiều dài mặt phẳng, max_weight, icao_code) GIÁ TRỊ ('A. 61 Terrier',1008,'piston',1,36,23.25,2400,'AUS6'), ('B. 121 Pup',1008,'piston',1,31,23.17,1600,'PUP'), ('B. 206',1008,'piston',2,55,33.67,7500,'BASS'), ('D. 4-108',1008,'piston',1,36,23.33,1900,'D4'), ('D. 5-108 Husky',1008,'piston',1,36,23.17,2400,'D5'); Nếu cần, hãy thay thế Cú pháp câu lệnh travel1Câu lệnh 1 2 3 4 5 CẬP NHẬT [BỎ QUA] tên_bảng SET cột = giá trị [, column = value].. . [WHERE where_condition] [ĐẶT HÀNG BỞI order_list] [HẠN CHẾ row_count] Cú pháp không bao gồm tất cả các phần tử trong một câu lệnh Đây là một sự cố của năm điều khoản
Với năm mệnh đề này, bạn có thể xây dựng một loạt các câu lệnh Khi bạn thấy câu lệnh đang hoạt động, bạn sẽ không gặp vấn đề gì khi hiểu tất cả các mệnh đề hoạt động như thế nào và sử dụng chúng để cập nhật dữ liệu. Trên thực tế, việc cập nhật dữ liệu gần như quá dễ dàng và nếu không cẩn thận, bạn có thể khiến mọi thứ trở nên lộn xộn đáng kể. Việc sửa đổi dữ liệu có thể khó hoàn tác, vì vậy bạn cần tiến hành một cách thận trọng, đặc biệt là khi bạn lần đầu tiên học cách sử dụng câu lệnh Thực hiện cập nhật cơ bản trong MySQLBây giờ bạn đã có một cái nhìn tổng quan cơ bản về cú pháp câu lệnh Giả sử bạn muốn làm tròn tất cả các giá trị trong cột 1 2 CẬP NHẬT máy bay ĐẶT sải cánh = VÒNG(wingspan); Mệnh đề Đó là tất cả những gì cần thiết để cập nhật dữ liệu
Theo mặc định, bạn không thể thực hiện cập nhật mà không có mệnh đề Để tạm thời tắt chế độ an toàn, hãy sử dụng câu lệnh 1 2 3 4 5 6 SET SQL_SAFE_UPDATES = 0;
CẬP NHẬT máy bay ĐẶT sải cánh = VÒNG(wingspan);
SET SQL_SAFE_UPDATES = 1; Các câu lệnh Để biết thêm chi tiết về SET và các biến và cài đặt toàn cục. Xem Sử dụng biến hệ thống trong Tài liệu MySQL Ngay cả ở cấp độ phiên, câu lệnh 1 CHỌN * TỪ máy bay; Hình 1 cho thấy một phần kết quả được trả về bởi câu lệnh travel 5Trong một số trường hợp, bạn có thể muốn cập nhật nhiều cột cùng một lúc. Đối với điều này, bạn cần thêm các phép gán cột bổ sung, phân tách chúng bằng dấu phẩy. Ví dụ: câu lệnh 1 2 3 4 5 6 SET SQL_SAFE_UPDATES = 0;
CẬP NHẬT máy bay ĐẶT sải cánh = VÒNG(wingspan), plane_length = ROUND(plane_length);
SET SQL_SAFE_UPDATES = 1; Cả hai phép gán cột đều hoạt động theo cùng một cách. Bạn chỉ cần làm tròn các giá trị cột thành số nguyên. Nếu bạn truy vấn bảng travel 5 và airplanes 3Bằng cách sử dụng các mệnh đề Thêm mệnh đề manufacturers0 vào câu lệnh travel1 của bạnHầu hết các câu lệnh 1 2 3 4 5 6 7 CẬP NHẬT máy bay SET engine_type = 'piston (adg-i)' WHERE manufacturer_id = 1008;
CHỌN * TỪ máy bay WHERE manufacturer_id = 1008; Mệnh đề Ghi chú. Trong trường hợp bạn đang thắc mắc, giá trị Điều đó nói rằng, hóa ra là B. Máy bay 206 thực sự phải thuộc Nhóm II, có nghĩa là bạn cần cập nhật bản ghi đó mà không cần cập nhật các bản ghi khác. May mắn thay, bạn có thể xác định nhiều điều kiện trong mệnh đề 1 2 3 CẬP NHẬT máy bay SET engine_type = 'piston (adg-ii)' WHERE manufacturer_id = 1008 AND plane = 'B.206'; Như trong ví dụ trước, mệnh đề Sau khi bạn chạy câu lệnh Bạn có thể làm cho mệnh đề Làm việc với các giá trị cộtTrong ví dụ đầu tiên của bài viết này, bạn đã thấy cách sử dụng hàm hệ thống 1 2 3 SET sải cánh = sải cánh + 3, plane_length = plane_length + 5 WHERE plane_id = 344; Trong trường hợp này, tôi đã sử dụng giá trị Sau khi chạy câu lệnh này, bạn có thể truy vấn bảng travel 5 và airplanes 3Nếu bạn so sánh Hình 5 với Hình 4, bạn sẽ thấy rằng hàng có giá trị Nếu bạn cố cập nhật một cột có cùng giá trị mà nó đã có, MySQL đủ thông minh để nhận ra các giá trị giống nhau và không thay đổi giá trị ban đầu. Cách tiếp cận này có khả năng giảm chi phí không cần thiết và giảm thiểu tác động đối với các hoạt động đồng thời có thể đang cố truy xuất hoặc sửa đổi giá trị đó cùng một lúc. MySQL cũng đủ thông minh để nhận ra khi bạn cố gắng chèn một giá trị không được chấp nhận vào một cột. Chẳng hạn, câu lệnh 1 CẬP NHẬT máy bay SET engine_type = NULL WHERE plane_id = 344; Bởi vì cột được xác định là
Bạn cũng sẽ gặp lỗi nếu cố gắng cập nhật một cột thành giá trị có loại dữ liệu không chính xác. Ví dụ: câu lệnh 1 2 3 CẬP NHẬT máy bay SET max_weight = 'unknown' WHERE plane_id = 344; Không ngạc nhiên, câu lệnh này cũng sẽ thất bại vì cột
Giống như việc chèn dữ liệu, việc cập nhật dữ liệu yêu cầu bạn phải làm quen với các cột mục tiêu có giá trị mà bạn đang cố gắng sửa đổi. Chỉ biết kiểu dữ liệu thôi là chưa đủ. Bạn cũng phải hiểu cách định nghĩa kiểu dữ liệu. Ví dụ: nếu bạn cố cập nhật cột Cập nhật các cột khóa ngoại trong bảng MySQLCó thể đôi khi bạn muốn cập nhật một giá trị trong cột khóa ngoại. Tuy nhiên, điều này có thể phức tạp vì MySQL thực hiện kiểm tra khóa ngoại. Ví dụ: giả sử bạn muốn sửa đổi cột 1 2 3 CẬP NHẬT máy bay SET manufacturer_id = 2001 WHERE manufacturer_id = 1008; Không có gì đáng ngạc nhiên, MySQL sẽ chùn bước khi bạn cố chạy câu lệnh này và thay vào đó sẽ trả về lỗi sau (trừ khi bạn đã bao gồm từ khóa
Bạn không thể cập nhật khóa ngoại thành giá trị không tồn tại trong cột được tham chiếu. Trước tiên, bạn phải thực hiện các thay đổi cần thiết đối với bảng cha. Tuy nhiên, điều này cũng có thể phức tạp. Ví dụ: bạn có thể thử sửa đổi giá trị 1 2 3 CẬP NHẬT nhà sản xuất SET manufacturer_id = 2001 WHERE manufacturer_id = 1008; Thật không may, điều này cũng sẽ khiến MySQL phát sinh lỗi vì bạn không thể cập nhật giá trị đang được tham chiếu bởi khóa ngoại
Bạn có thể giải quyết những vấn đề này bằng cách tạm thời tắt kiểm tra khóa ngoại trong phiên của mình (hoặc bằng cách đặt tùy chọn 1 2 3 4 5 6 7 8 9 10 11 SET foreign_key_checks = 0;
CẬP NHẬT nhà sản xuất SET manufacturer_id = 2001 WHERE manufacturer_id = 1008;
CẬP NHẬT máy bay SET manufacturer_id = 2001 WHERE manufacturer_id = 1008;
SET foreign_key_checks = 1; Bằng cách này, bạn có thể cập nhật các giá trị Sau khi chạy các câu lệnh này, bạn có thể truy vấn bảng 1 CHỌN * TỪ nhà sản xuất WHERE manufacturer_id = 2001; Hình 6 cho thấy dữ liệu được trả về bởi câu lệnh này. Như bạn có thể thấy, bảng đã được cập nhật mà không gặp vấn đề gì, một phần là do bạn đã chỉ định một giá trị khóa chính mới chưa tồn tại manufacturers Bạn cũng có thể truy vấn bảng 1 CHỌN * TỪ máy bay Ở ĐÂU manufacturer_id = 2001; Hình 7 hiển thị kết quả trả về của truy vấn. Như mong đợi, các giá trị UPDATE 3 trong bảng airplanes Rất có thể, bạn sẽ không phải cập nhật các cột khóa ngoại quá thường xuyên, nhưng bạn nên hiểu những gì cần thiết để thực hiện điều đó. Chỉ cần biết rằng có những vấn đề khác cần lưu ý, chẳng hạn như không cố gắng chèn các khóa chính trùng lặp Cập nhật các cột khóa chính trong bảng MySQLĐối với khóa ngoại, đôi khi bạn cần cập nhật các giá trị trong cột khóa chính. Nếu bạn cập nhật một giá trị (như bạn đã thấy ở trên), thì thường không có vấn đề gì miễn là giá trị mới phù hợp với yêu cầu của cột. Tuy nhiên, mọi thứ trở nên phức tạp hơn nếu cập nhật nhiều giá trị cùng một lúc. Ví dụ: câu lệnh 1 2 3 CẬP NHẬT máy bay SET plane_id = plane_id + 1 WHERE manufacturer_id = 2001; Câu lệnh có nhiều khả năng thất bại do thứ tự mà MySQL cập nhật từng hàng dữ liệu (mặc dù bạn không bao giờ có thể chắc chắn về thứ tự chính xác mà công cụ cơ sở dữ liệu sẽ chọn khi cập nhật dữ liệu). Điều này là do MySQL đang cố cập nhật giá trị ban đầu thành giá trị đã tồn tại và bản thân nó đang chờ được cập nhật. Chẳng hạn, nếu MySQL cố cập nhật hàng đầu tiên từ
Bạn có thể muốn bao gồm từ khóa 1 2 3 CẬP NHẬT BỎ QUA máy bay SET plane_id = plane_id + 1 WHERE manufacturer_id = 2001; Từ khóa
Nếu bạn truy vấn bảng UPDATE 50 khi cập nhật cột UPDATE 21Một giải pháp tốt hơn là bao gồm một mệnh đề 1 2 3 4 CẬP NHẬT máy bay SET plane_id = plane_id + 1 WHERE manufacturer_id = 2001 ĐẶT HÀNG BỞI plane_id DESC; Khi bạn bao gồm mệnh đề Hình 9 cho thấy dữ liệu bây giờ trông như thế nào sau khi chạy câu lệnh manufacturers 3 manufacturers 4 vào câu lệnh UPDATE của bạnCó thể bạn sẽ không cần sử dụng mệnh đề Một mệnh đề khác tương tự về mặt này là mệnh đề 1 2 3 4 5 CẬP NHẬT máy bay SET plane_id = plane_id + 1 WHERE manufacturer_id = 2001 ĐẶT HÀNG BỞI plane_id DESC GIỚI HẠN 3; Bởi vì câu lệnh manufacturers 2 vào câu lệnh UPDATE của bạnTôi nghi ngờ rằng bạn sẽ không thường xuyên đưa mệnh đề Làm việc với câu lệnh MySQL travel1Câu lệnh Bất kể bạn sử dụng điều khoản nào, bạn nên hiểu tất cả chúng hoạt động như thế nào để đảm bảo rằng bạn đang sửa đổi dữ liệu của mình một cách hiệu quả nhất có thể, đồng thời đảm bảo tính chính xác của những cập nhật đó. May mắn thay, câu lệnh
1 Làm cách nào để cập nhật một hàng trong MySQL?CẬP NHẬT MySQL . Đầu tiên bạn chỉ định tên bảng muốn cập nhật dữ liệu sau từ khóa UPDATE Thứ hai, chỉ định cột nào bạn muốn cập nhật và giá trị mới trong mệnh đề SET. . Thứ ba, chỉ định những hàng nào sẽ được cập nhật bằng điều kiện trong mệnh đề WHERE Bản cập nhật MySQL trả về cái gì?Để biết thông tin về các cột được tạo, hãy xem Phần 13. 1. 20. 8, “TẠO BẢNG và Cột được tạo”. UPDATE trả về số hàng đã thực sự thay đổi . Hàm mysql_info() C API trả về số hàng đã khớp và được cập nhật cũng như số cảnh báo đã xảy ra trong quá trình CẬP NHẬT.
Các hàng bị ảnh hưởng khi cập nhật trong MySQL là gì?Đối với câu lệnh CẬP NHẬT, giá trị số hàng bị ảnh hưởng theo mặc định là số hàng thực sự bị thay đổi . Nếu bạn chỉ định cờ CLIENT_FOUND_ROWS cho mysql_real_connect() khi kết nối với mysqld, giá trị hàng bị ảnh hưởng là số hàng “tìm thấy”; .
Làm cách nào để lấy số hàng được cập nhật trong MySQL?ROW_COUNT() trả về số hàng được cập nhật, chèn hoặc xóa bởi câu lệnh trước đó. Điều này giống như số lượng hàng mà máy khách mysql hiển thị và giá trị từ hàm API mysql_affected_rows() C. |