2011-09-22 37 views
15

Tôi tự hỏi liệu có thể thay đổi giá trị ENUM trên một bảng hay không, để trong tất cả các hàng có giá trị là ENUM, thay đổi được thực hiện tốt.Thay đổi giá trị của một giá trị ENUM MySQL, trong suốt một bảng

+0

Sử dụng câu lệnh cập nhật? 'UPDATE table1 SET enum1 = 'male' WHERE enum1 = 'female'' – Johan

+1

@Johan - Và điều đó sẽ không gây ra bất kỳ vấn đề gì? Tôi đoán nó sẽ phải được thực hiện trước khi sử dụng 'ALTER' để thay đổi giá trị' ENUM'. Nhưng nó có được phép không? Tôi tự hỏi vì tôi nghĩ rằng chỉ những giá trị được chỉ định mới được phép chọn trong một cột enum? Và nếu giá trị mới chưa được chỉ định ... – stefmikhail

+2

Thực hiện thay đổi trước và sau đó cập nhật, bạn không thể đặt giá trị enum thành giá trị chưa được đặt trong câu lệnh 'create table' /' alter table'. – Johan

Trả lời

25

Nếu bạn muốn thay đổi giá trị của một enum:

Giả enum cũ của bạn là:

ENUM('English', 'Spanish', 'Frenchdghgshd', 'Chinese', 'German', 'Japanese') 

Để thay đổi việc sử dụng:

-- Add a new enum value 
ALTER TABLE `tablename` CHANGE `fieldname` `fieldname` ENUM 
('English', 'Spanish', 'Frenchdghgshd', 'Chinese', 'German', 'Japanese', 'French'); 
-- Update the table to change all the values around. 
UPDATE tablename SET fieldname = 'French' WHERE fieldname = 'Frenchdghgshd'; 
-- Remove the wrong enum from the definition 
ALTER TABLE `tablename` CHANGE `fieldname` `fieldname` ENUM 
('English', 'Spanish', 'Chinese', 'German', 'Japanese', 'French'); 

MySQL có thể sẽ đi qua tất cả các hàng trong bảng của bạn đang cố gắng cập nhật nội dung, tôi đã nghe những câu chuyện về tối ưu hóa được lên kế hoạch xung quanh, nhưng tôi không chắc liệu điều đó có thực sự xảy ra hay không.

+0

Vì vậy, bạn nghĩ rằng MySQL sẽ tự động đi qua cơ sở dữ liệu và thực hiện bất kỳ thay đổi cần thiết? Tôi đã nghĩ một phương pháp khác sẽ sử dụng 'ALTER' để * thêm * giá trị' ENUM' mới vào tập hợp, sau đó sử dụng 'UPDATE' để thay thế bất kỳ phiên bản nào trong bảng giá trị cũ, với giá trị mới. Cuối cùng, sử dụng 'ALTER' để xóa giá trị' ENUM' cũ. Bạn có nghĩ nó sẽ hiệu quả không? – stefmikhail

+0

Một enum không thực sự lưu trữ một chuỗi trong trường nó chỉ sử dụng số nguyên nhỏ nhất sẽ giữ các giá trị trong enum, thường là tinyint. Nếu bạn thay đổi các chuỗi trong một mysql enum thường thời gian không phải làm bất cứ điều gì để hàng – Johan

+0

do đó, nó chỉ liên kết nó thông qua một số nguyên? – stefmikhail

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