2010-02-02 41 views
22

Tôi cần một cách nhanh chóng sao chép cột DATETIME trong một bảng và đặt tên cho nó là một tên mới.Nhanh chóng thêm bản sao của cột vào bảng MySQL

Tôi có một cột có tên myDate trong bảng của tôi được gọi là myResults, tôi cần truy vấn để tạo cột mới trong bảng có tên newDate có cùng dữ liệu chính xác với cột myDate. Có cách nào nhanh hơn để thực hiện điều này bằng cách thực hiện phương pháp 2 bước rõ ràng để tạo cột mới và sau đó sao chép tất cả dữ liệu (đó là một bảng lớn và tôi đang tìm cách tiếp cận nhanh nhất)?

giải pháp rõ ràng:

ALTER TABLE `myResults` ADD `newDate` DATETIME; 
UPDATE `myResults` SET `newDate` = `myDate`; 

Trả lời

17

Các giải pháp rõ ràng là giải pháp duy nhất, không may.

Tuy nhiên, lưu ý rằng nói chung bạn không nên sao chép một cột trong cơ sở dữ liệu quan hệ.

+0

Vâng cột mới thực sự chỉ để đánh dấu db với dữ liệu mặc định trước khi một tập lệnh chạy qua và thay đổi dữ liệu trong cột đó. – Robbie

+5

Không thể tập lệnh đọc dữ liệu từ cột nguồn và cập nhật nó chỉ trong một lần truyền? (Không cần sao chép dữ liệu trước). –

1

Nếu bạn chỉ cần một mặc định trong đó, bạn có thể chọn những gì mặc định là tĩnh hoặc sử dụng một cuộc gọi chức năng.

ALTER TABLE `myResults` ADD `newDate` DATETIME DEFAULT '2010-01-01'; 

hoặc

ALTER TABLE `myResults` ADD `newDate` DATETIME DEFAULT current_timestamp; 
+0

Thật không may mặc định cần phải là giá trị của myDate. – Robbie

+0

Để tập lệnh chạy? Nếu kịch bản là keying tắt của các sau đó làm cho một cái gì đó mặc định thực sự xa trong quá khứ DEFAULT '1800-01-01'.? – Matt

+0

Vâng, tập lệnh chỉ thay đổi một số giá trị. Bất kỳ unchaged nên được myDate. Nó không phải là một kịch bản rất hay nhưng đó là những gì tôi phải làm việc. – Robbie

2

Tại sao khối lượng công việc của bạn bao giờ đòi hỏi một cột datetime mới, mà bản sao khác cột dữ liệu? Điều này nghe giống như thực hành đáng sợ? Làm thế nào về cho chúng tôi biết những gì bạn đang cố gắng để đạt được? Bạn có thể kéo một cột thứ hai với cùng một dữ liệu trong một vài cách khác nhau, mà không thực sự sao chép dữ liệu:

SELECT date1 AS date_old, date1 AS date_new FROM table; 

-hoặc-, bạn có thể tạo một xem

CREATE VIEW virtual_table AS 
    SELECT date1 AS date_old, date1 AS date_new FROM table 
; 
SELECT * FROM virtual_table; 
+0

Xin lỗi, tôi đã đề cập rằng đây là dữ liệu chính cho một kịch bản để thay đổi trong các nhận xét của các câu trả lời khác. Tôi thực sự không bao giờ thực sự muốn chúng có cùng giá trị trừ khi kịch bản không thay đổi chúng. – Robbie

+0

"dữ liệu chính cho một kịch bản để thay đổi trong các ý kiến ​​của các câu trả lời khác", vẫn không rõ ràng về những gì bạn đang nói về. –

9
UPDATE `table_name` SET `new_column` = `existing_column` WHERE `id`=`id` 
+5

Nhưng điều đó không tạo cột mới ... –

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