2012-01-24 73 views
19

Khi sử dụng insert... on duplicate key update, cú pháp để cập nhật nhiều cột là gì?Cập nhật khóa trùng lặp - Nhiều cột

INSERT INTO table1 (col1, col2, col3, col4) VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’) 
ON DUPLICATE KEY UPDATE col2=‘$val2’, col3=‘$val3’, col4=‘$val4’ // <-- not sure 

Cập nhật: Tôi đang sử dụng tính năng này trong PHP. Vì đây là một câu hỏi cú pháp, nó rất phù hợp.

$result = mysql_query("INSERT INTO table1 (col1, col2, col3, col4) 
         VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’) 
         ON DUPLICATE KEY UPDATE (col2=‘$val2’, col3=‘$val3’, col4=‘$val4’)") 

Một lần nữa, không chắc chắn về phần cuối cùng này với "Cập nhật".

Trả lời

0

Truy vấn của bạn có vẻ đúng. Dưới đây là ví dụ của tôi thuộc loại này của truy vấn:

INSERT INTO Stat (id, month, year, views, redirects, onList, onMap, emails) VALUE ("' . $Id . '","' . $month . '","' . $year . '",0,0,"' . $data['onList'] . '","' . $data['onMap'] . '",0) ON DUPLICATE KEY UPDATE onList=onList+' . $data['onList'] . ', onMap=onMap+' . $data['onMap'] 
+0

tại sao 'onList' thứ hai cần thiết trong' onList = onList + '. $ data [' onList '].'? không đủ để có 'onList = $ data ['onList']'? hoặc trong ví dụ của tôi: 'col2 = '$ val2''? –

+0

những gì anh ấy đang làm hơi khác một chút, anh ấy thêm $ data ['onList'] vào giá trị trường onList. – sathia

29
INSERT INTO table1 
    (`col1`, `col2`, `col3`, `col4`) 
VALUES 
    ('val1', 'val2', 'val3', 'val4') 
ON DUPLICATE KEY UPDATE 
    `col2`='val2', 
    `col3`='val3', [...] 

Tôi cố định dấu ngoặc kép và dấu kiểm của bạn.

Edit:

Trong PHP:

$result = mysql_query(" 
    INSERT INTO table1 
     (col1, col2, col3, col4) 
    VALUES 
     ('" . $val1 . "', '" . $val2 . "', '" . $val3 . "', '" . $val4 . "') 
    ON DUPLICATE KEY UPDATE 
     col2='" . $val2 . "', 
     col3='" . $val3 . "', 
     col4='" . $val4 . "'" 
); 

Lưu ý rằng các giá trị được bao quanh bởi dấu ngoặc kép đơn '. Nếu các giá trị là một kiểu số (INT, FLOAT, vv), bạn có thể thả các dấu ngoặc kép đó. Backticks là tùy chọn xung quanh tên cột miễn là bạn không sử dụng tên cột như count, type hoặc table.

Trong ví dụ PHP, chuỗi nối được sử dụng để phân tách rõ ràng các biến.

+0

xem cập nhật của tôi, đây là trong tập lệnh php, do đó cú pháp. Tôi sẽ đánh giá cao nếu bạn có thể xem ngay bây giờ. cảm ơn –

+0

bạn không thể sử dụng dấu chọn cho các giá trị, chúng được sử dụng với tên cột. sử dụng cú pháp tôi đã hiển thị trên câu trả lời của tôi. nó sẽ hoạt động. – sathia

+0

$ result = mysql_query ("INSERT INTO table1 ('col1', 'col2', 'col3', 'col4') VALUES (". $ Val1. ",". $ Val2. ",". $ Val3. ", ". $ val4.") TRÊN KHI CẬP NHẬT TUYỂN DỤNG CHÍNH 'col2' = ". $ val2.", 'col3' = ". $ val3.", 'col4' = ". $ val4.") – sathia

0

Vì lợi ích của cú pháp rõ ràng, có một dạng cú pháp khác;

INSERT INTO `table1` SET `id`=$id, 
         `col2`='$col2', 
         `col3`='$col3'[, ...] 
ON DUPLICATE KEY UPDATE `col2`='$col2', 
         `col4`='$col4'[, ...] 

Ví dụ;

INSERT INTO customers SET cid=10, 
          createdon=NOW(), 
          createdby='user', 
          cname='Steve' 
    ON DUPLICATE KEY UPDATE modifiedon=NOW(), 
          modifiedby='user', 
          cname='Steve'; 

Nếu không tồn tại khách hàng có ID = 10 trong cơ sở dữ liệu nó sẽ được tạo và cột cid, createdon, createdby, cname sẽ được đặt. Nếu nó tồn tại, sau đó nó sẽ được cập nhật và các cột modifiedon, modifiedbym, cname sẽ được cập nhật.

LƯU Ý # 1: Nếu bạn đặt khóa chính cid = 0 tại đây, nó sẽ kích hoạt AUTO_INCREMENT (tất nhiên, nếu cột pk được định nghĩa là AUTO_INCREMENT) và bản ghi sẽ được chèn!

LƯU Ý # 2: TRÊN KHIẾU NẠI CHÍNH TUYỂN DỤNG cập nhật bản ghi PK ID hiện có. Nhưng nó cũng làm cho cập nhật nếu DUPLICATE được thực hiện trên bất kỳ cột KEY UNIQUE. Ví dụ, nếu bạn đã xác định rằng cột cname là UNIQUE, thì lưu bản ghi với cname = 'Steve' đã tồn tại sẽ dẫn đến UPDATE của bản ghi đó (không phải INSERT mới). Hãy cẩn thận về điều này bởi vì bạn có thể mong đợi rằng DB trả về lỗi cho vi phạm ràng buộc UNIQUE KEY mà sẽ không xảy ra ở đây.

14

Vâng, đây là cũ.Nhưng tất nhiên bạn chỉ cần cung cấp một giá trị lần, không có lý do để thêm một lần thứ hai trong truy vấn (mà có ích cho nhiều chèn, hoặc chuẩn bị phát biểu):

INSERT INTO table1 
    (col1, col2, col3, col4) 
VALUES 
    ('val1', 'val2', 'val3', 'val4') 
ON DUPLICATE KEY UPDATE 
    col2=VALUES(col2) 
    col3=VALUES(col3) [,...] 

nào có như lợi thế nó sẽ vẫn hoạt động đối với một tuyên bố chèn nhiều:

INSERT INTO table1 
    (col1, col2, col3, col4) 
VALUES 
    ('val1', 'val2', 'val3', 'val4'), 
    ('val5', 'val6', 'val7', 'val8'), 
    ('val9', 'val10', 'val11', 'val12') 
ON DUPLICATE KEY UPDATE 
    col2=VALUES(col2) 
    col3=VALUES(col3) [,...] 
+0

Đây là câu trả lời hay nhất, chỉ cần sử dụng My Chức năng của SQL hỗ trợ nhiều lần chèn –

Các vấn đề liên quan