2010-05-06 16 views
140

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 phải thay đổi một trường.MySQL: Cách sao chép hàng, nhưng thay đổi một vài 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ả những hàng và tạo ra các hàng mới trong khi thiết lập các Event_ID-155. Làm thế nào tôi có thể thực hiện điều này?

Trả lời

192
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 người khác hơn EVENT_ID) trong bảng.

+19

là có cách nào để làm điều đó mà không cần phải xác định các cột? – Andrew

+3

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 một cái 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 bạn :). Cách bạn sẽ làm điều đó là sử dụng information_schema để lấy tên cột cho bảng. Nhưng đó thực sự là quá mức cần thiết, tôi chỉ cần gõ tên cột. – dcp

+1

chính xác ví dụ tôi cần, cảm ơn. Tôi đã không chắc chắn nếu bạn có thể làm điều đó theo cách đó. – salonMonsters

33

Hãy nói rằng 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

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

+0

Cảm ơn! Giải pháp của bạn đã làm điều đó cho tôi. :) – Woppi

+0

Ví dụ hay, ngắn ngọt ngào và đầy đủ! –

2

Hey thế nào về để sao chép tất cả các lĩnh vực, thay đổi một trong số họ với cùng giá trị + cái gì khác.

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

??????????

9

Nếu bạn có vô số cột trong bảng và không muốn loại bỏ từng cột, bạn có thể thực hiện bằng cách sử dụng 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 
+5

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

105

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

Làm thế nào để sao chép một số hàng vào cùng một bảng, với một số lĩnh vự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 Tempora bảng ry với các giá trị bạn muốn
  3. Nếu bạn có một lĩnh vực tự động tăng, bạn nên đặt nó vào 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 ban đầu của bạn
  5. Xóa bảng tạm thời

mã của bạn:

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 

chung đang kịch bản:

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 

đang Giản/ngưng tụ:

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; 

Như tạo ra các bảng tạm thời sử dụng các từ khóa TEMPORARY nó sẽ bị bỏ tự động khi kết thúc phiên (như @ ar34z gợi ý).

+0

Cảm ơn, Alex. Mã này làm việc cho tôi. – TecBrat

+6

MySQL hỗ trợ từ khóa 'TEMPORARY' để tạo các bảng tạm thời. Việc sử dụng 'TẠO TEMPORARY TABLE 'sẽ tự động thả bảng khi phiên làm việc (một chuỗi các truy vấn SQL) được hoàn thành. 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 một 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 #temporary_table thay vì temporary_table, có thể là vấn đề về MSSQL? – TruthOf42

0

Chừng nào EVENT_ID là Integer, 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" 
Các vấn đề liên quan