MySQL: Làm thế nào để sao chép các hàng, nhưng thay đổi một vài trường?


195

Tôi có một số lượng lớn các hàng mà tôi muốn sao chép, nhưng tôi cần thay đổi một trường.

Tôi có thể chọn các hàng mà tôi muốn sao chép:

select * from Table where Event_ID = "120"

Bây giờ tôi muốn sao chép tất cả các hàng đó và tạo các hàng mới trong khi đặt Event_IDthành 155. Làm thế nào tôi có thể thực hiện điều này?

Câu trả lời:


278
INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"

Ở đây, col2, ... đại diện cho các cột còn lại (những cột khác ngoài Event_ID) trong bảng của bạn.


39
Có cách nào để làm điều đó mà không phải chỉ định tên cột?
Andrew

4
Không phải là tôi biết. Tất nhiên, nếu bảng của bạn có 1000 cột hoặc thứ gì đó và bạn không muốn nhập tất cả chúng, thì bạn có thể viết một câu lệnh SQL để xây dựng câu lệnh SQL của mình :). Cách bạn sẽ làm là sử dụng information_schema để lấy tên cột cho bảng. Nhưng điều đó thực sự quá mức, tôi chỉ cần gõ tên cột.
dcp

3
Điều này có thể sử dụng dấu hoa thị để lấy các cột còn lại không?
Peter

2
Đăng nhập vào upvote chỉ để tìm hiểu tôi đã upvote này rồi. Tôi đoán điều này đã cứu tôi nhiều lần bây giờ :) Cảm ơn bạn!
aexl

2
@Bitterblue - Xin lỗi, tôi không hiểu bình luận của bạn. Tôi chưa bao giờ nói col2, ... là các cột mà bạn không muốn sao chép, tôi chỉ nói chúng đại diện cho các cột còn lại từ bảng. Rõ ràng là chúng sẽ được sao chép, nếu không, chúng sẽ không nằm trong câu lệnh SQL.
dcp

140

Đây là một giải pháp trong đó bạn có nhiều trường trong bảng của mình và không muốn bị chuột rút khi gõ tất cả các trường, chỉ cần nhập những trường cần thiết :)

Cách sao chép một số hàng vào cùng một bảng, với một số trường có các giá trị khác nhau:

  1. Tạo một bảng tạm thời với tất cả các hàng bạn muốn sao chép
  2. Cập nhật tất cả các hàng trong bảng tạm thời với các giá trị bạn muốn
  3. Nếu bạn có trường tăng tự động, bạn nên đặt nó thành NULL trong bảng tạm thời
  4. Sao chép tất cả các hàng của bảng tạm thời vào bảng gốc của bạn
  5. Xóa bảng tạm thời

Ma cua ban:

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";

UPDATE temporary_table SET Event_ID="120";

UPDATE temporary_table SET ID=NULL

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

Mã kịch bản chung:

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

UPDATE temporary_table SET <auto_inc_field>=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

Mã đơn giản / cô đọng:

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

INSERT INTO original_table SELECT * FROM temporary_table;

Khi tạo bảng tạm thời sử dụng TEMPORARYtừ khóa, nó sẽ tự động bị hủy khi phiên kết thúc (như @ ar34z đề xuất).


7
MySQL hỗ trợ TEMPORARYtừ khóa để tạo các bảng tạm thời. Việc sử dụng CREATE TEMPORARY TABLEsẽ tự động thả bảng khi phiên (một chuỗi các truy vấn SQL) kết thúc. Việc bỏ bảng sẽ không cần thiết và nó không xung đột với các bảng tạm thời khác sử dụng cùng tên. (ví dụ: khi hack trực tiếp (mà tôi không khuyến nghị))
ar34z

1
mã này chỉ hoạt động nếu bạn sử dụng #t tạm_table thay vì tạm thời, có thể là sự cố MSSQL?
TruthOf42

16
Điều này về cơ bản hoạt động hoàn hảo với tôi, nhưng tôi đã phải vượt qua một ràng buộc Không Null đối với khóa chính trong bảng tạm thời dường như được sao chép từ bảng gốc. Tôi đã sửa lỗi này bằng cách thay đổi bảng tạm thời trước khi cập nhật như sau: ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; Sau đó, việc cập nhật khóa chính thành Null sẽ không thất bại.
snorris

1
Tôi không thể làm cho nó hoạt động trong PostgreQuery 9.4 : Exception: null value in column <auto_inc_not_null_field> violates not-null constraint. Tôi đã thửALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000

1
Tôi đã thử nghiệm với các phiên bản MySQL và MariaDB khác nhau. Hoạt động hoàn hảo đối với tôi và tôi thích phiên bản này hơn câu trả lời được chấp nhận, điều này thực sự xảy ra khá thường xuyên ở đây :)
phần mềm hexerei

40

Giả sử bảng của bạn có hai cột khác: foo và bar

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"

4
Có cách nào để làm điều đó mà không phải chỉ định tên cột?
Andrew

@PeterBailey Mới đối với MySQL, bạn có thể vui lòng làm sáng tỏ về cách thức hoạt động của mã: /
3kstc

10

Nếu bạn có vô số cột trong bảng của mình và không muốn gõ từng cột bạn có thể làm điều đó bằng cách sử dụng một bảng tạm thời, như;

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

6
một lưu ý: điều này giả định rằng bạn không có khóa chính trong bảng của mình
kommradHomer

2

Này, làm thế nào để sao chép tất cả các trường, thay đổi một trong số chúng thành cùng một giá trị + một cái gì đó khác.

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"

??????????


0

Miễn là Event_ID là Integer, hãy làm điều này:

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.