Hướng dẫn update ignore mysql - cập nhật bỏ qua mysql

13.2.11 & NBSP; Tuyên bố cập nhật

UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 là một câu lệnh DML sửa đổi các hàng trong bảng.

Cú pháp đơn bàn:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET assignment_list [WHERE where_condition] [ORDER BY ...] [LIMIT row_count] value: {expr | DEFAULT} assignment: col_name = value assignment_list: assignment [, assignment] ...

Cú pháp nhiều bàn:

UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]

Đối với cú pháp bảng đơn, câu lệnh UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 cập nhật các cột của các hàng hiện có trong bảng được đặt tên với các giá trị mới. Điều khoản UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]4 chỉ ra cột nào cần sửa đổi và các giá trị chúng nên được đưa ra. Mỗi giá trị có thể được đưa ra dưới dạng biểu thức hoặc từ khóa UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]5 để đặt một cột một cách rõ ràng thành giá trị mặc định của nó. Điều khoản UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]6, nếu được đưa ra, chỉ định các điều kiện xác định các hàng nào sẽ cập nhật. Không có mệnh đề UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]6, tất cả các hàng được cập nhật. Nếu mệnh đề UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]8 được chỉ định, các hàng được cập nhật theo thứ tự được chỉ định. Điều khoản UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]9 đặt giới hạn về số lượng hàng có thể được cập nhật.

Đối với cú pháp nhiều bảng, UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 Cập nhật các hàng trong mỗi bảng có tên trong UPDATE t1 SET col1 = col1 + 1;1 đáp ứng các điều kiện. Mỗi hàng phù hợp được cập nhật một lần, ngay cả khi nó phù hợp với các điều kiện nhiều lần. Đối với cú pháp nhiều bảng, không thể sử dụng UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]8 và UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]9.

Đối với các bảng được phân vùng, cả hai hình thức đơn và nhiều bảng của câu lệnh này đều hỗ trợ việc sử dụng mệnh đề UPDATE t1 SET col1 = col1 + 1;4 như một phần của tham chiếu bảng. Tùy chọn này lấy một danh sách một hoặc nhiều phân vùng hoặc các phần phụ (hoặc cả hai). Chỉ các phân vùng (hoặc các phần phụ) được liệt kê mới được kiểm tra các trận đấu và một hàng không có trong bất kỳ phân vùng hoặc phân vùng nào này không được cập nhật, cho dù nó có thỏa mãn UPDATE t1 SET col1 = col1 + 1;5 hay không.

Ghi chú

Không giống như trường hợp khi sử dụng UPDATE t1 SET col1 = col1 + 1;4 với câu lệnh UPDATE t1 SET col1 = col1 + 1;7 hoặc UPDATE t1 SET col1 = col1 + 1;8, một câu lệnh UPDATE t1 SET col1 = col1 + 1;9 có giá trị khác được coi là thành công ngay cả khi không có hàng trong các phân vùng được liệt kê (hoặc phân nhóm) khớp với UPDATE t1 SET col1 = col1 + 1;5.

Để biết thêm thông tin và ví dụ, xem Phần & NBSP; 22.5, Lựa chọn phân vùng.

UPDATE t1 SET col1 = col1 + 1;5 là một biểu thức đánh giá đúng cho mỗi hàng được cập nhật. Đối với cú pháp biểu thức, xem phần & nbsp; 9.5, biểu thức của Hồi giáo.

UPDATE t1 SET col1 = col1 + 1;1 và UPDATE t1 SET col1 = col1 + 1;5 được chỉ định như được mô tả trong Phần & NBSP; 13.2.9, Tuyên bố chọn.

Bạn chỉ cần đặc quyền UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 cho các cột được tham chiếu trong một UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 thực sự được cập nhật. Bạn chỉ cần đặc quyền UPDATE t1 SET col1 = col1 + 1, col2 = col1;6 cho bất kỳ cột nào được đọc nhưng không được sửa đổi.

Câu lệnh UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 hỗ trợ các công cụ sửa đổi sau:

  • Với công cụ sửa đổi UPDATE t1 SET col1 = col1 + 1, col2 = col1;8, việc thực hiện UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 bị trì hoãn cho đến khi không có máy khách nào khác đọc từ bảng. Điều này chỉ ảnh hưởng đến các công cụ lưu trữ chỉ sử dụng khóa cấp bảng (chẳng hạn như UPDATE t SET id = id + 1;0, UPDATE t SET id = id + 1;1 và UPDATE t SET id = id + 1;2).

  • Với công cụ sửa đổi UPDATE t SET id = id + 1;3, câu lệnh Update không hủy bỏ ngay cả khi lỗi xảy ra trong quá trình cập nhật. Các hàng mà xung đột khóa trùng lặp xảy ra trên một giá trị khóa duy nhất không được cập nhật. Các hàng được cập nhật lên các giá trị sẽ gây ra lỗi chuyển đổi dữ liệu được cập nhật lên các giá trị hợp lệ gần nhất thay thế. Để biết thêm thông tin, hãy xem ảnh hưởng của việc bỏ qua đối với việc thực thi tuyên bố.

Các câu lệnh UPDATE t SET id = id + 1;4, bao gồm cả những câu lệnh có mệnh đề UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]8, được gắn cờ là không an toàn cho sao chép dựa trên tuyên bố. (Điều này là do thứ tự các hàng được cập nhật xác định các hàng nào bị bỏ qua.) cách thức. .

Nếu bạn truy cập một cột từ bảng để được cập nhật trong một biểu thức, UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 sử dụng giá trị hiện tại của cột. Ví dụ: câu lệnh sau đây đặt UPDATE t SET id = id + 1;8 thành một so với giá trị hiện tại của nó:

UPDATE t1 SET col1 = col1 + 1;

Bài tập thứ hai trong câu lệnh sau đặt UPDATE t SET id = id + 1;9 cho giá trị hiện tại (cập nhật) UPDATE t SET id = id + 1;8, không phải là giá trị UPDATE t SET id = id + 1;8 gốc. Kết quả là UPDATE t SET id = id + 1;8 và UPDATE t SET id = id + 1;9 có cùng giá trị. Hành vi này khác với SQL tiêu chuẩn.

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

Bài tập UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 bảng đơn thường được đánh giá từ trái sang phải. Đối với các bản cập nhật nhiều bảng, không có gì đảm bảo rằng các bài tập được thực hiện theo bất kỳ thứ tự cụ thể nào.

Nếu bạn đặt một cột thành giá trị hiện tại, MySQL sẽ thông báo điều này và không cập nhật nó.

Nếu bạn cập nhật một cột đã được khai báo UPDATE t SET id = id + 1 ORDER BY id DESC;5 bằng cách đặt thành UPDATE t SET id = id + 1 ORDER BY id DESC;6, xảy ra lỗi nếu chế độ SQL nghiêm ngặt được bật; Mặt khác, cột được đặt thành giá trị mặc định ngầm cho kiểu dữ liệu cột và số lượng cảnh báo được tăng lên. Giá trị mặc định ngầm là UPDATE t SET id = id + 1 ORDER BY id DESC;7 cho các loại số, chuỗi trống (UPDATE t SET id = id + 1 ORDER BY id DESC;8) cho các loại chuỗi và giá trị không có giá trị cho các loại ngày và thời gian. Xem Phần & NBSP; 11.6, Kiểu dữ liệu Giá trị mặc định.zero value for date and time types. See Section 11.6, “Data Type Default Values”.

Nếu một cột được tạo được cập nhật rõ ràng, giá trị được phép duy nhất là UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]5. Để biết thông tin về các cột được tạo, xem Phần & NBSP; 13.1.18.7, Tạo bảng và các cột được tạo.

UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 Trả về số lượng hàng thực sự đã thay đổi. Hàm API UPDATE items,month SET items.price=month.price WHERE items.id=month.id;1 C trả về số lượng hàng được khớp và cập nhật và số lượng cảnh báo xảy ra trong thời gian UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2.

Bạn có thể sử dụng UPDATE items,month SET items.price=month.price WHERE items.id=month.id;3 để hạn chế phạm vi của UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2. Một điều khoản UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]9 là một hạn chế phù hợp với hàng. Tuyên bố dừng lại ngay khi nó tìm thấy UPDATE items,month SET items.price=month.price WHERE items.id=month.id;6 các hàng thỏa mãn mệnh đề UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]6, cho dù chúng có thực sự được thay đổi hay không.

Nếu một câu lệnh UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 bao gồm một mệnh đề UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]8, các hàng được cập nhật theo thứ tự được chỉ định bởi mệnh đề. Điều này có thể hữu ích trong các tình huống nhất định có thể dẫn đến lỗi. Giả sử rằng bảng CREATE TABLE items ( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, wholesale DECIMAL(6,2) NOT NULL DEFAULT 0.00, retail DECIMAL(6,2) NOT NULL DEFAULT 0.00, quantity BIGINT NOT NULL DEFAULT 0 );0 chứa cột CREATE TABLE items ( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, wholesale DECIMAL(6,2) NOT NULL DEFAULT 0.00, retail DECIMAL(6,2) NOT NULL DEFAULT 0.00, quantity BIGINT NOT NULL DEFAULT 0 );1 có chỉ mục duy nhất. Câu lệnh sau đây có thể thất bại với lỗi khóa trùng lặp, tùy thuộc vào thứ tự các hàng được cập nhật:

UPDATE t SET id = id + 1;

Ví dụ: nếu bảng chứa 1 và 2 trong cột CREATE TABLE items ( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, wholesale DECIMAL(6,2) NOT NULL DEFAULT 0.00, retail DECIMAL(6,2) NOT NULL DEFAULT 0.00, quantity BIGINT NOT NULL DEFAULT 0 );1 và 1 được cập nhật lên 2 trước khi 2 được cập nhật lên 3, xảy ra lỗi. Để tránh vấn đề này, hãy thêm một mệnh đề UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]8 để gây ra các hàng có giá trị CREATE TABLE items ( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, wholesale DECIMAL(6,2) NOT NULL DEFAULT 0.00, retail DECIMAL(6,2) NOT NULL DEFAULT 0.00, quantity BIGINT NOT NULL DEFAULT 0 );1 lớn hơn được cập nhật trước những giá trị có giá trị nhỏ hơn:

UPDATE t SET id = id + 1 ORDER BY id DESC;

Bạn cũng có thể thực hiện các hoạt động UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 bao gồm nhiều bảng. Tuy nhiên, bạn không thể sử dụng UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]8 hoặc UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]9 với UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 nhiều bảng. Điều khoản UPDATE t1 SET col1 = col1 + 1;1 liệt kê các bảng liên quan đến tham gia. Cú pháp của nó được mô tả trong Phần & NBSP; 13.2.9.2, Điều khoản tham gia. Đây là một ví dụ:

UPDATE items,month SET items.price=month.price WHERE items.id=month.id;

Ví dụ trước cho thấy một lần nối bên trong sử dụng toán tử dấu phẩy, nhưng các câu lệnh UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 nhiều bảng có thể sử dụng bất kỳ loại tham gia nào được phép trong các câu lệnh UPDATE t1 SET col1 = col1 + 1, col2 = col1;6, chẳng hạn như mysql> UPDATE items > SET retail = retail * 0.9 > WHERE id IN > (SELECT id FROM items > WHERE retail / wholesale >= 1.3 AND quantity > 100); ERROR 1093 (HY000): You can't specify target table 'items' for update in FROM clause2.

Nếu bạn sử dụng câu lệnh UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 nhiều bảng liên quan đến các bảng mysql> UPDATE items > SET retail = retail * 0.9 > WHERE id IN > (SELECT id FROM items > WHERE retail / wholesale >= 1.3 AND quantity > 100); ERROR 1093 (HY000): You can't specify target table 'items' for update in FROM clause4 có các ràng buộc chính của nước ngoài, trình tối ưu hóa MySQL có thể xử lý các bảng theo thứ tự khác với mối quan hệ cha mẹ/trẻ em của họ. Trong trường hợp này, tuyên bố thất bại và quay trở lại. Thay vào đó, hãy cập nhật một bảng duy nhất và dựa vào các khả năng mysql> UPDATE items > SET retail = retail * 0.9 > WHERE id IN > (SELECT id FROM items > WHERE retail / wholesale >= 1.3 AND quantity > 100); ERROR 1093 (HY000): You can't specify target table 'items' for update in FROM clause5 mà mysql> UPDATE items > SET retail = retail * 0.9 > WHERE id IN > (SELECT id FROM items > WHERE retail / wholesale >= 1.3 AND quantity > 100); ERROR 1093 (HY000): You can't specify target table 'items' for update in FROM clause4 cung cấp để khiến các bảng khác được sửa đổi phù hợp. Xem Phần & NBSP; 13.1.18.5, các ràng buộc khóa nước ngoài.

Bạn không thể cập nhật một bảng và chọn trực tiếp từ cùng một bảng trong một truy vấn con. Bạn có thể làm việc xung quanh điều này bằng cách sử dụng bản cập nhật nhiều bàn trong đó một trong các bảng có nguồn gốc từ bảng mà bạn thực sự muốn cập nhật và đề cập đến bảng dẫn xuất bằng bí danh. Giả sử bạn muốn cập nhật một bảng có tên mysql> UPDATE items > SET retail = retail * 0.9 > WHERE id IN > (SELECT id FROM items > WHERE retail / wholesale >= 1.3 AND quantity > 100); ERROR 1093 (HY000): You can't specify target table 'items' for update in FROM clause7 được xác định bằng cách sử dụng câu lệnh được hiển thị ở đây:

CREATE TABLE items ( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, wholesale DECIMAL(6,2) NOT NULL DEFAULT 0.00, retail DECIMAL(6,2) NOT NULL DEFAULT 0.00, quantity BIGINT NOT NULL DEFAULT 0 );

Để giảm giá bán lẻ của bất kỳ mặt hàng nào mà đánh dấu là 30% hoặc lớn hơn và trong số đó bạn có ít hơn một trăm trong kho, bạn có thể cố gắng sử dụng một câu lệnh UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2 như cái sau, sử dụng một truy vấn con trong UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]6 mệnh đề. Như được hiển thị ở đây, tuyên bố này không hoạt động:

mysql> UPDATE items > SET retail = retail * 0.9 > WHERE id IN > (SELECT id FROM items > WHERE retail / wholesale >= 1.3 AND quantity > 100); ERROR 1093 (HY000): You can't specify target table 'items' for update in FROM clause

Thay vào đó, bạn có thể sử dụng bản cập nhật nhiều bảng trong đó trình điều khiển con được chuyển vào danh sách các bảng sẽ được cập nhật, sử dụng bí danh để tham khảo nó trong mệnh đề UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]6 ngoài cùng, như thế này:

UPDATE items, (SELECT id FROM items WHERE id IN (SELECT id FROM items WHERE retail / wholesale >= 1.3 AND quantity < 100)) AS discounted SET items.retail = items.retail * 0.9 WHERE items.id = discounted.id;

Bởi vì trình tối ưu hóa cố gắng hợp nhất bảng dẫn xuất UPDATE items, (SELECT id FROM items WHERE id IN (SELECT id FROM items WHERE retail / wholesale >= 1.3 AND quantity < 100)) AS discounted SET items.retail = items.retail * 0.9 WHERE items.id = discounted.id;1 vào khối truy vấn ngoài cùng, điều này chỉ hoạt động nếu bạn buộc vật chất hóa bảng dẫn xuất. Bạn có thể thực hiện điều này bằng cách đặt cờ UPDATE items, (SELECT id FROM items WHERE id IN (SELECT id FROM items WHERE retail / wholesale >= 1.3 AND quantity < 100)) AS discounted SET items.retail = items.retail * 0.9 WHERE items.id = discounted.id;2 của biến hệ thống UPDATE items, (SELECT id FROM items WHERE id IN (SELECT id FROM items WHERE retail / wholesale >= 1.3 AND quantity < 100)) AS discounted SET items.retail = items.retail * 0.9 WHERE items.id = discounted.id;3 thành UPDATE items, (SELECT id FROM items WHERE id IN (SELECT id FROM items WHERE retail / wholesale >= 1.3 AND quantity < 100)) AS discounted SET items.retail = items.retail * 0.9 WHERE items.id = discounted.id;4 trước khi chạy bản cập nhật hoặc bằng cách sử dụng gợi ý của trình tối ưu hóa UPDATE items, (SELECT id FROM items WHERE id IN (SELECT id FROM items WHERE retail / wholesale >= 1.3 AND quantity < 100)) AS discounted SET items.retail = items.retail * 0.9 WHERE items.id = discounted.id;5, như được hiển thị ở đây:

UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]0

Ưu điểm của việc sử dụng gợi ý của trình tối ưu hóa trong trường hợp như vậy là nó chỉ áp dụng trong khối truy vấn nơi nó được sử dụng, do đó không cần thiết phải thay đổi giá trị của UPDATE items, (SELECT id FROM items WHERE id IN (SELECT id FROM items WHERE retail / wholesale >= 1.3 AND quantity < 100)) AS discounted SET items.retail = items.retail * 0.9 WHERE items.id = discounted.id;3 một lần nữa sau khi thực hiện UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]2.

Một khả năng khác là viết lại trình điều khiển con để nó không sử dụng UPDATE items, (SELECT id FROM items WHERE id IN (SELECT id FROM items WHERE retail / wholesale >= 1.3 AND quantity < 100)) AS discounted SET items.retail = items.retail * 0.9 WHERE items.id = discounted.id;8 hoặc UPDATE items, (SELECT id FROM items WHERE id IN (SELECT id FROM items WHERE retail / wholesale >= 1.3 AND quantity < 100)) AS discounted SET items.retail = items.retail * 0.9 WHERE items.id = discounted.id;9, như thế này:

UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]1

Trong trường hợp này, truy vấn con được thực hiện theo mặc định thay vì được hợp nhất, do đó không cần thiết phải vô hiệu hóa việc hợp nhất bảng dẫn xuất.

Chủ đề