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

cú pháp

Khố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]
  • Bạn có thể cập nhật hoàn toàn một hoặc nhiều trường
  • Bạn có thể chỉ định bất kỳ điều kiện nào bằng mệnh đề WHERE
  • Bạn có thể cập nhật các giá trị trong một bảng tại một thời điểm

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 Script

PHP 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
", $mysqli->connect_error); exit(); } printf('Connected successfully.
'); if ($mysqli->query('UPDATE tutorials_tbl set tutorial_title = "Learning Java" where tutorial_id = 4')) { printf("Table tutorials_tbl updated successfully.
"); } if ($mysqli->errno) { printf("Could not update table: %s
", $mysqli->error); } $sql = "SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl"; $result = $mysqli->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { printf("Id: %s, Title: %s, Author: %s, Date: %d
", $row["tutorial_id"], $row["tutorial_title"], $row["tutorial_author"], $row["submission_date"]); } } else { printf('No record found.
'); } mysqli_free_result($result); $mysqli->close(); ?>

đầu ra

Truy 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

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');

/* this should return the correct numbers of deleted records */
mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Records deleted: %d\n", mysql_affected_rows());

/* with a where clause that is never true, it should return 0 */
mysql_query('DELETE FROM mytable WHERE 0');
printf("Records deleted: %d\n", mysql_affected_rows());
?>

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 UPDATE cho phép bạn sửa đổi các giá trị trong bảng cơ sở dữ liệu của mình, bao gồm các bảng tạm thời. Với một câu lệnh duy nhất, bạn có thể cập nhật một hoặc nhiều hàng, một hoặc nhiều cột hoặc bất kỳ sự kết hợp nào của cả hai. Bạn thậm chí có thể cập nhật nhiều bảng. Khi bạn đọc hết bài viết này, bạn sẽ thấy rằng câu lệnh UPDATE rất trực quan và dễ sử dụng, một khi bạn hiểu những điều cơ bản về cách thức hoạt động của nó

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 (manufacturersairplanes) mà tôi đã sử dụng cho một số bài viết trước trong loạt bài này

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 travel sẽ được thiết lập và sẵn sàng hoạt động. Nếu không, bạn vẫn có thể theo dõi bài viết này, chỉ biết rằng kết quả truy vấn của bạn sẽ hơi khác so với kết quả tôi hiển thị ở đây

Để thiết lập cơ sở dữ liệu travel—nếu bạn chưa làm như vậy—hãy tải xuống MySQL_06_setup. sql và chạy tập lệnh SQL đối với phiên bản MySQL của bạn. Tập lệnh tạo cơ sở dữ liệu và bảng và chèn dữ liệu mẫu. Ngoài ra, bạn có thể tạo cơ sở dữ liệu và sau đó chạy tập lệnh sau để tạo bảng manufacturersairplanes

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 manufacturersairplanes để hỗ trợ các ví dụ trong bài viết này. Bắt đầu với bảng manufacturers bằng cách chạy câu lệnh UPDATE2 sau đây, thêm Beagle Aircraft Limited làm nhà sản xuất

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 UPDATE3. Nếu bạn đã theo dõi chính xác một vài bài viết cuối cùng, giá trị sẽ là UPDATE4. Nếu không, hãy ghi lại giá trị UPDATE3 mà bạn nhận được ở đây vì bạn sẽ cần nó cho phần còn lại của bài báo, bắt đầu với câu lệnh UPDATE2 sau đây

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ế UPDATE4 bằng giá trị UPDATE3 của bạn rồi chạy câu lệnh này. Sau khi thực hiện xong, bạn nên thiết lập để làm theo các ví dụ trong bài viết này. Tuy nhiên, hãy lưu ý rằng một số ví dụ sau đây tham chiếu đến cột UPDATE3, vì vậy nếu giá trị không phải là UPDATE4 trên hệ thống của bạn, hãy đảm bảo sử dụng đúng cột

Cú pháp câu lệnh travel1

Câu lệnh UPDATE trong MySQL hỗ trợ năm mệnh đề, hai trong số đó là bắt buộc và ba mệnh đề là tùy chọn, như được chỉ ra trong cú pháp sau

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 UPDATE, nhưng nó cung cấp hầu hết các phần tử đó. Đây là những từ bạn sẽ sử dụng phần lớn thời gian, không chỉ khi tìm hiểu về câu lệnh mà còn sau khi bạn đã thành thạo nó. Để biết cú pháp hoàn chỉnh, hãy kiểm tra tài liệu MySQL trên câu lệnh CẬP NHẬT

Đây là một sự cố của năm điều khoản

  • Mệnh đề UPDATE, một trong hai mệnh đề bắt buộc của câu lệnh, chỉ định bảng là mục tiêu của bản cập nhật. Bạn có thể chỉ định nhiều bảng trong mệnh đề này, phân tách chúng bằng dấu phẩy, nhưng trọng tâm của tôi trong bài viết này là cập nhật một bảng. Tôi đang lưu chủ đề cập nhật nhiều bảng để đề cập đến các chủ đề nâng cao hơn
  • Mệnh đề travel5, mệnh đề bắt buộc khác, chỉ định cột nào cần cập nhật. Bạn có thể bao gồm một hoặc nhiều bài tập cột. Đối với mỗi nhiệm vụ, hãy chỉ định tên cột, dấu bằng và giá trị mới. Nếu bạn bao gồm nhiều bài tập, hãy phân tách chúng bằng dấu phẩy
  • Mệnh đề travel6 xác định hàng nào cần cập nhật, dựa trên một hoặc nhiều điều kiện. Mệnh đề hoạt động giống như mệnh đề travel6 trong câu lệnh travel8. Mặc dù mệnh đề travel6 là tùy chọn, nhưng bạn nên hết sức cẩn thận khi chạy một câu lệnh UPDATE không bao gồm một mệnh đề. Nếu không có mệnh đề travel6, câu lệnh sẽ cập nhật mọi hàng trong bảng, trừ khi bao gồm mệnh đề manufacturers2
  • Mệnh đề manufacturers3 manufacturers4 chỉ định thứ tự các hàng sẽ được cập nhật. Điều này có thể hữu ích trong các tình huống có thể dẫn đến lỗi, như bạn sẽ thấy ở phần sau của bài viết. Mệnh đề manufacturers3 manufacturers4 tương tự như mệnh đề bạn đã thấy trong câu lệnh travel8. Mệnh đề không thể được sử dụng để cập nhật nhiều bảng
  • Mệnh đề manufacturers2 giới hạn số hàng sẽ được cập nhật. Nếu bạn bao gồm mệnh đề travel6, thì số đếm sẽ áp dụng cho các hàng được mệnh đề đó trả về. Điều này có nghĩa là câu lệnh sẽ dừng dựa trên số lượng hàng thỏa mãn điều kiện travel6, cho dù những hàng đó có thực sự được cập nhật hay không. Như với mệnh đề manufacturers3 manufacturers4, mệnh đề manufacturers2 không thể được sử dụng để cập nhật nhiều bảng

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 UPDATE. Hầu hết thời gian, bạn sẽ sử dụng các mệnh đề UPDATE, travel5 và travel6, mặc dù mệnh đề manufacturers3 manufacturers4 và mệnh đề manufacturers2 đôi khi cũng có ích

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 UPDATE. Chắc chắn, không thực hành trong một môi trường sản xuất. Khi bạn cập nhật môi trường sản xuất, hãy đảm bảo thực hiện việc đó trong một giao dịch, một chủ đề mà tôi dự định sẽ trình bày sau trong loạt bài này

Thực hiện cập nhật cơ bản trong MySQL

Bâ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 UPDATE, đã đến lúc xem câu lệnh đó hoạt động như thế nào để bạn có thể cảm nhận được nó hoạt động như thế nào. Như tôi đã đề cập, mệnh đề UPDATEtravel5 là những mệnh đề bắt buộc duy nhất, vì vậy hãy bắt đầu với chúng

Giả sử bạn muốn làm tròn tất cả các giá trị trong cột travel5 trong bảng airplanes thành số nguyên. Để đạt được điều này, bạn tạo câu lệnh UPDATE sau

1

2

CẬP NHẬT máy bay

ĐẶT sải cánh = VÒNG(wingspan);

Mệnh đề UPDATE xác định airplanes làm bảng đích và mệnh đề travel5 xác định rằng các giá trị trong cột travel5 phải được làm tròn, điều này đạt được bằng cách sử dụng hàm travel2 tích hợp

Đó là tất cả những gì cần thiết để cập nhật dữ liệu travel5. Tuy nhiên, rất có thể khi bạn cố chạy câu lệnh này, bạn sẽ nhận được lỗi sau

travel4

Theo mặc định, bạn không thể thực hiện cập nhật mà không có mệnh đề travel6 chỉ định cột chính. Điều này giúp đảm bảo rằng bạn không thực hiện những thay đổi sâu rộng mà sau này bạn sẽ hối tiếc. Bạn có thể tắt chế độ an toàn (như thông báo lỗi gợi ý), vĩnh viễn hoặc tạm thời. Tôi khuyên bạn nên thực hiện tạm thời để tránh mọi thay đổi không mong muốn ở nơi khác

Để tạm thời tắt chế độ an toàn, hãy sử dụng câu lệnh travel5 để thay đổi biến hệ thống travel7 thành travel8 trước khi chạy câu lệnh UPDATE của bạn, sau đó đặt biến thành manufacturers0 sau khi bạn chạy câu lệnh, như minh họa trong ví dụ sau

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 travel5 chỉ đơn thuần là tắt và sau đó bật biến trong phiên hiện tại. Tuy nhiên, hãy lưu ý rằng câu lệnh travel5 hỗ trợ tùy chọn manufacturers3, đặt một biến ở phạm vi toàn cầu. Theo thông lệ chung, không sử dụng tùy chọn này khi tắt cập nhật an toàn. Sẽ ít rủi ro hơn nhiều khi thực hiện các loại thay đổi này ở cấp độ phiên để ngăn chặn bất kỳ rủi ro ngoài ý muốn nào. Chỉ sử dụng manufacturers3 nếu nó cần thiết trong hoàn cảnh của bạn

Để 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 travel5 giúp bạn có thể thực thi câu lệnh UPDATE của mình mà không tạo ra lỗi. Bạn có thể xác nhận các thay đổi bằng cách chạy một câu lệnh travel8 đơn giản sau khi thực hiện đoạn mã trên

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 travel8. Lưu ý rằng các giá trị travel5 bây giờ đều là số nguyên

Cập nhật mysql và trả lại hàng
Hình 1. Làm tròn các giá trị trong cột travel5

Trong 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 UPDATE sau sửa đổi cả hai cột travel5 và airplanes3

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 airplanes sau khi chạy câu lệnh UPDATE, kết quả của bạn sẽ giống như kết quả trong Hình 2

Cập nhật mysql và trả lại hàng
Hình 2. Làm tròn các giá trị trong cột travel5 và airplanes3

Bằng cách sử dụng các mệnh đề UPDATEtravel5, bạn có thể nhanh chóng cập nhật tất cả các giá trị của cột. Chỉ cần cẩn thận nếu thực hiện phương pháp này. Quá dễ dàng để làm mọi thứ rối tung lên

Thêm mệnh đề manufacturers0 vào câu lệnh travel1 của bạn

Hầu hết các câu lệnh UPDATE của bạn có thể sẽ bao gồm mệnh đề travel6 để giúp bạn nhắm mục tiêu tốt hơn dữ liệu mà bạn muốn sửa đổi. Mệnh đề travel6 chỉ định một hoặc nhiều điều kiện thu hẹp các hàng được cập nhật. Ví dụ: câu lệnh sau bao gồm mệnh đề travel6 giới hạn các bản cập nhật đối với các hàng có giá trị UPDATE3 là UPDATE4

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 đề travel5 trong câu lệnh này đặt giá trị manufacturers9 thành UPDATE00 UPDATE01 cho các hàng được nhắm mục tiêu. Kết quả từ việc thực hiện các câu lệnh sẽ giống như Hình 3

Cập nhật mysql và trả lại hàng
Hình 3. Giới hạn cập nhật của bạn đối với các hàng cụ thể

Ghi chú. Trong trường hợp bạn đang thắc mắc, giá trị UPDATE02 là tham chiếu đến phân loại của Nhóm thiết kế máy bay (ADG), một hệ thống được sử dụng để phân loại máy bay bằng cách chia chúng thành sáu nhóm dựa trên sải cánh và chiều cao đuôi. Chữ thường UPDATE03 chỉ ra rằng các mặt phẳng trong ví dụ này thuộc Nhóm I. (Tôi nhận thấy rằng bạn có thể muốn thêm một cột cho các nhóm ADG. Cách tiếp cận tôi thực hiện ở đây chỉ nhằm chứng minh những khái niệm này. )

Đ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 đề travel6 của mình để giúp thu hẹp các hàng. Trong ví dụ sau, mệnh đề travel6 bao gồm hai điều kiện, một điều kiện dựa trên cột UPDATE3 và điều kiện kia dựa trên cột UPDATE07

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 đề travel6 giới hạn cập nhật cho các hàng có giá trị UPDATE3 là UPDATE4. Tuy nhiên, điều khoản cũng quy định rằng giá trị UPDATE07 phải bằng với UPDATE12. Hai điều kiện được liên kết với nhau bằng toán tử logic UPDATE13, có nghĩa là cả hai điều kiện phải được đánh giá là đúng thì hàng mới được cập nhật

Sau khi bạn chạy câu lệnh UPDATE, bạn có thể truy xuất các hàng giống như trước đây. Kết quả của bạn sẽ trông tương tự như kết quả trong Hình 4. Chú ý rằng B. Máy bay 206 hiện được hiển thị là máy bay Nhóm II

Cập nhật mysql và trả lại hàng
hinh 4. Giới hạn cập nhật của bạn ở một hàng cụ thể

Bạn có thể làm cho mệnh đề travel6 của mình càng chi tiết càng tốt để đảm bảo rằng bạn đang cập nhật các hàng mục tiêu chứ không phải các hàng khác. Điều quan trọng là sử dụng các toán tử logic của bạn một cách chính xác để đảm bảo rằng logic điều kiện của bạn là chính xác

Làm việc với các giá trị cột

Trong 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 travel2 để làm tròn giá trị trong bảng airplanes. Khi bạn cập nhật một cột theo cách này, MySQL sẽ sử dụng giá trị hiện tại của cột để tạo một giá trị mới. Khả năng sử dụng giá trị hiện tại cho phép xây dựng dựa trên giá trị đó theo những cách vượt ra ngoài việc chỉ áp dụng một hàm. Ví dụ: câu lệnh UPDATE sau đây thêm 3 vào giá trị travel5 và 5 vào giá trị airplanes3

1

2

3

CẬP NHẬTmáy bay airplanes

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ị UPDATE21 UPDATE22 trong mệnh đề travel6 mà tôi phải tra cứu trong bảng. Tuy nhiên, bạn có thể muốn sử dụng một phương pháp khác để tìm giá trị này, chẳng hạn như truy xuất nó thông qua một truy vấn con, chủ đề mà tôi dự định sẽ đề cập sau trong loạt bài này

Sau khi chạy câu lệnh này, bạn có thể truy vấn bảng airplanes để xác minh kết quả, bảng này sẽ trông giống như kết quả được hiển thị trong Hình 5

Cập nhật mysql và trả lại hàng
Hình 5. Tăng giá trị trong cột travel5 và airplanes3

Nế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ị UPDATE21 của UPDATE22 đã được cập nhật. Bạn cũng có thể nhận thấy rằng MySQL đã tự động cập nhật cột UPDATE29, đây là cột được tạo nhân với các giá trị travel5 và airplanes3

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 UPDATE sau cố gắng thay đổi cột manufacturers9 thành UPDATE34

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à UPDATE35 UPDATE34, câu lệnh UPDATE sẽ không thành công và tạo ra lỗi sau

UPDATE38

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 UPDATE sau cố gắng cập nhật cột UPDATE40 thành giá trị chuỗi UPDATE41

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 UPDATE40 được xác định với kiểu dữ liệu UPDATE43. Thay vì cập nhật giá trị, MySQL trả về lỗi sau

UPDATE44

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 UPDATE45 bằng chuỗi UPDATE46, bạn sẽ tạo ra lỗi vì cột được xác định là UPDATE47

Cập nhật các cột khóa ngoại trong bảng MySQL

Có 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 UPDATE3 trong bảng airplanes

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 UPDATE50

UPDATE51

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ị UPDATE3 trong bảng manufacturers

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

UPDATE54

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 UPDATE55 trên khóa ngoại, điều mà tôi sẽ thảo luận trong bài viết sau). Để đạt được điều này, hãy đặt biến hệ thống UPDATE56 thành travel8 trước khi chạy các câu lệnh UPDATE, sau đó đặt lại thành manufacturers0 sau khi chạy các câu lệnh

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ị UPDATE3 trong cả hai bảng mà không tạo ra bất kỳ lỗi khóa ngoại nào. Xin nhắc lại, tránh sử dụng tùy chọn manufacturers3 trong câu lệnh travel5 của bạn. Nếu bạn tắt kiểm tra khóa ngoại ở cấp độ toàn cầu, thì bạn đang đặt rủi ro cho tính toàn vẹn của dữ liệu của mình

Sau khi chạy các câu lệnh này, bạn có thể truy vấn bảng manufacturers để xác minh các thay đổi của mình

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

Cập nhật mysql và trả lại hàng
Hình 6. Cập nhật bảng manufacturers

Bạn cũng có thể truy vấn bảng airplanes để xác minh rằng các hàng đã được cập nhật đúng cách

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ị UPDATE3 đã được cập nhật trong tất cả các hàng mục tiêu

Cập nhật mysql và trả lại hàng
Hình 7. Cập nhật cột UPDATE3 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 UPDATE sau cố gắng thêm 1 vào tất cả các giá trị UPDATE21 trong các hàng có giá trị UPDATE3 là UPDATE72

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ừ UPDATE73 thành UPDATE74 trước khi hàng thứ hai được thay đổi, câu lệnh sẽ không thành công và MySQL sẽ trả về lỗi sau

UPDATE75

Bạn có thể muốn bao gồm từ khóa UPDATE50 để cố gắng giải quyết vấn đề này

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 UPDATE50 hướng dẫn MySQL trả về một cảnh báo thay vì lỗi và tiếp tục thực thi câu lệnh thay vì dừng lại. Trong trường hợp này, bạn có thể sẽ nhận được bốn cảnh báo, cùng với thông báo cho biết chỉ có một hàng được cập nhật thành công

UPDATE78

UPDATE79

UPDATE80

UPDATE81

UPDATE82

UPDATE83

Nếu bạn truy vấn bảng airplanes, bạn có thể thấy rằng chỉ có hàng cuối cùng được cập nhật, như thể hiện trong Hình 8. Điều này là do hàng cuối cùng là hàng duy nhất không cố cập nhật giá trị khóa chính thành giá trị hiện có

Cập nhật mysql và trả lại hàng
Hình 8. Sử dụng tùy chọn UPDATE50 khi cập nhật cột UPDATE21

Một giải pháp tốt hơn là bao gồm một mệnh đề manufacturers3 manufacturers4 sắp xếp các hàng theo giá trị UPDATE21, theo thứ tự giảm dần

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 đề manufacturers3 manufacturers4 theo cách này, MySQL sẽ áp dụng các bản cập nhật bắt đầu từ hàng cuối cùng, giúp có thể tăng các giá trị lên 1 mà không tạo ra bất kỳ lỗi hoặc cảnh báo nào

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 UPDATE

Cập nhật mysql và trả lại hàng
Hình 9. Thêm mệnh đề manufacturers3 manufacturers4 vào câu lệnh UPDATE của bạn

Có thể bạn sẽ không cần sử dụng mệnh đề manufacturers3 manufacturers4 thường xuyên, nhưng khi bạn làm vậy, nó sẽ tỏ ra rất hữu ích

Một mệnh đề khác tương tự về mặt này là mệnh đề manufacturers2, giới hạn số lượng hàng được cập nhật. Chẳng hạn, câu lệnh cập nhật sau đây giới hạn số hàng là UPDATE99

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 UPDATE vẫn bao gồm mệnh đề manufacturers3 manufacturers4, ba hàng được cập nhật bắt đầu từ dưới cùng và đi lên. Hình 10 hiển thị kết quả truy vấn bảng sau khi cập nhật

Cập nhật mysql và trả lại hàng
Hình 10. Thêm mệnh đề manufacturers2 vào câu lệnh UPDATE của bạn

Tôi nghi ngờ rằng bạn sẽ không thường xuyên đưa mệnh đề manufacturers2 vào câu lệnh UPDATE của mình (nếu có), nhưng có thể nảy sinh những tình huống mà bạn thấy nó hữu ích. Ví dụ: bạn có thể muốn kiểm tra một câu lệnh UPDATE thường sửa đổi một số lượng lớn các hàng. Nếu bạn bao gồm mệnh đề manufacturers2 trong khi kiểm tra câu lệnh, bạn sẽ giảm được lượng thời gian và quá trình xử lý cần thiết để xác minh rằng câu lệnh đang hoạt động bình thường

Làm việc với câu lệnh MySQL travel1

Câu lệnh UPDATE là một trong những câu lệnh phổ biến nhất được sử dụng khi làm việc với dữ liệu MySQL. Trong hầu hết các trường hợp, bạn sẽ bao gồm các mệnh đề UPDATE, travel5 và travel6. Đôi khi, bạn có thể bỏ qua điều khoản travel6—bạn sẽ gặp nguy hiểm—và vào những thời điểm khác, bạn có thể kết hợp điều khoản manufacturers3 manufacturers4 hoặc điều khoản manufacturers2 (hoặc cả hai). Tuy nhiên, phần lớn các cập nhật của bạn có thể sẽ dựa vào ba mệnh đề chí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 UPDATE khá dễ hiểu và dễ sử dụng, vì vậy bạn sẽ không gặp vấn đề gì khi bắt đầu

 

Cập nhật mysql và trả lại hàng

Lukas Vileikis 31 tháng một 2023

Cập nhật mysql và trả lại hàng

Lukas Vileikis 31 tháng một 2023

Tối ưu hóa truy vấn trong MySQL. Tối ưu hóa số lần đọc

1

  • MySQL

Tối ưu hóa thao tác đọc là một trong những vấn đề nổi bật nhất liên quan đến bất kỳ người quản trị cơ sở dữ liệu nào. Bất kể loại hệ thống quản lý cơ sở dữ liệu nào đang được sử dụng - MySQL, các hương vị của nó như Percona Server hoặc MariaDB, MongoDB, TimescaleDB, SQL Server hoặc các hệ thống khác, các truy vấn đọc đều là mối quan tâm. Ví dụ về truy vấn đọc chính là các truy vấn CHỌN, nhưng rất nhiều trong số này cũng liên quan đến CẬP NHẬT và XÓA vì chúng cũng phải tìm nạp các hàng để được thao tác trên đó. … Đọc thêm

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.