Helpex - Trao đổi & giúp đỡ Đăng nhập

Sao chép / Sao chép các bản ghi trong cùng một bảng MySQL?

Hồ Quỳnh Lam
· 11:01 08/04/2009
hôm qua

Tôi đã tìm kiếm một thời gian nhưng tôi không thể tìm thấy một giải pháp dễ dàng cho vấn đề của mình. Tôi muốn sao chép một bản ghi trong một bảng, nhưng tất nhiên, khóa chính duy nhất cần được cập nhật.

Tôi có truy vấn này:

INSERT INTO invoices
    SELECT * FROM invoices AS iv WHERE iv.ID=XXXXX
    ON DUPLICATE KEY UPDATE ID = (SELECT MAX(ID)+1 FROM invoices)

vấn đề là điều này chỉ thay đổi IDhàng thay vì sao chép hàng. Có ai biết làm thế nào để khắc phục điều này?

// chỉnh sửa: Tôi muốn làm điều này mà không cần nhập tất cả các tên trường vì tên trường có thể thay đổi theo thời gian.

83 hữu ích 0 bình luận 118k xem chia sẻ
Dương Thy Trúc
· 18:22 29/05/2010
18:22:36 29/05/2010

Cách mà tôi thường đi về nó là sử dụng một bảng tạm thời. Nó có thể không hiệu quả về mặt tính toán nhưng có vẻ như hoạt động tốt! Ở đây tôi đang sao chép toàn bộ bản ghi 99, tạo bản ghi 100.

CREATE TEMPORARY TABLE tmp SELECT * FROM invoices WHERE id = 99;

UPDATE tmp SET id=100 WHERE id = 99;

INSERT INTO invoices SELECT * FROM tmp WHERE id = 100;

Hy vọng rằng hoạt động tốt cho bạn!

127 hữu ích 5 bình luận chia sẻ
Trịnh Thắng Cảnh
· 10:18 10/11/2011
10:18:08 10/11/2011

Câu trả lời của Alex cần một số sự quan tâm (ví dụ: khóa hoặc giao dịch) trong môi trường nhiều khách hàng.

Giả sử AUTO IDtrường là trường đầu tiên trong bảng (một trường hợp thông thường), chúng ta có thể sử dụng các giao dịch ngầm.

    TẠO TABLE TABLE Tmp CHỌN * từ hóa đơn Ở ĐÂU ...;
    ALTER TABLE thả ID tmp; # thả trường tự động
    # CẬP NHẬT Tmp SET ...; # chỉ cần thay đổi các khóa duy nhất khác
    XÁC NHẬN VÀO hóa đơn CHỌN 0, tmp. * TỪ tmp;
    BẢNG DROP tmp;

Từ các tài liệu MySQL:

Sử dụng AUTO_INCREMENT: Bạn cũng có thể gán rõ ràng NULL hoặc 0 cho cột để tạo số thứ tự.

79 hữu ích 5 bình luận chia sẻ
Ngô Tường Lĩnh
· 11:07 08/04/2009
11:07:48 08/04/2009

Bạn BIẾT chắc chắn rằng, KHÓA DUPLICATE sẽ kích hoạt, do đó bạn có thể chọn MAX (ID) +1 trước:

INSERT INTO invoices SELECT MAX(ID)+1, ... other fields ... FROM invoices AS iv WHERE iv.ID=XXXXX 
11 hữu ích 3 bình luận chia sẻ
Đỗ Hạnh Tường
· 19:27 12/04/2013
19:27:37 12/04/2013

Cách tiếp cận của bạn là tốt nhưng vấn đề là bạn sử dụng "*" thay vì tranh thủ tên trường. Nếu bạn đặt tất cả các tên cột trừ khóa chính, tập lệnh của bạn sẽ hoạt động như bùa chú trên một hoặc nhiều bản ghi.

INSERT INTO invoices (iv.field_name, iv.field_name,iv.field_name ) SELECT iv.field_name, iv.field_name,iv.field_name FROM invoices AS iv WHERE iv.ID=XXXXX

11 hữu ích 0 bình luận chia sẻ
Hoàng Cao Nghiệp
· 15:10 30/01/2017
15:10:35 30/01/2017

Tôi biết một câu trả lời muộn, nhưng nó vẫn là một câu hỏi phổ biến, tôi muốn thêm một câu trả lời khác mà nó hoạt động với tôi, chỉ sử dụng insert intocâu lệnh đơn và tôi nghĩ rằng nó là thẳng, không tạo ra bất kỳ bảng mới nào (vì nó có thể là một vấn đề với CREATE TEMPORARY TABLEquyền):

INSERT INTO invoices (col_1, col_2, col_3, ... etc)
  SELECT
    t.col_1,
    t.col_2,
    t.col_3,
    ...
    t.updated_date,
  FROM invoices t;

Giải pháp đang hoạt động cho AUTO_INCREMENTcột id, nếu không, bạn cũng có thể thêm IDcột vào câu lệnh:

INSERT INTO invoices (ID, col_1, col_2, col_3, ... etc)
  SELECT
    MAX(ID)+1,
    t.col_1,
    t.col_2,
    t.col_3,
    ... etc ,
  FROM invoices t;

nó thực sự dễ dàng và dễ dàng, bạn có thể cập nhật bất cứ điều gì khác trong một dòng mà không cần bất kỳ tuyên bố cập nhật thứ hai nào sau này (ví dụ: cập nhật một cột tiêu đề bằng văn bản bổ sung hoặc thay thế một chuỗi bằng một chuỗi khác), bạn cũng có thể cụ thể với những gì chính xác bạn muốn nhân đôi, nếu tất cả thì đó là, nếu một số, bạn có thể làm như vậy.

7 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ mysql , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm