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 clause
2.

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 clause
4 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 clause
5 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 clause
4 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 clause
7 đượ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.