2008-11-06 40 views

Trả lời

97

Không, bạn không thể.

Tuy nhiên, bạn có thể dễ dàng tạo ra một kích hoạt để thực hiện điều này, chẳng hạn như:

 
CREATE TRIGGER before_insert_app_users 
    BEFORE INSERT ON app_users 
    FOR EACH ROW 
    SET new.api_key = uuid(); 
+1

@Xem http://stackoverflow.com/questions/6280789/generate-guid-in-mysql-for-existing-data để điền UUID vào các hàng hiện có. –

+1

Điều này không hoàn toàn giống như có giá trị DEFAULT. Làm thế nào người ta có thể thay đổi câu trả lời này để chỉ đặt khóa nếu giá trị là NULL? – ToolmakerSteve

+0

Tôi đã sửa đổi nó bằng md5 (uuid()) và hoạt động tốt. Aproach của tôi có ổn không? –

8

Thật không may, MySQL 5 yêu cầu hằng số cho mặc định. Vấn đề đã được thảo luận chi tiết hơn trong liên kết bên dưới. Nhưng câu trả lời duy nhất là cho phép null và thêm một trình kích hoạt bảng.

MySQL gần đây chỉ chấp nhận UUID như là một phần của gói DB và không phải là tính năng phong phú như chúng tôi muốn.

http://www.phpbuilder.com/board/showthread.php?t=10349169

+0

tôi nên thêm rằng cho phép NULL và dựa vào các trigger có thể làm việc, nhưng hầu hết các nhà phát triển sẽ coi nó là một giải pháp rất hack-y. Tôi sẽ không đích thân giới thiệu nó nhưng cho riêng họ. – TravisO

5

Tôi tin you can't:

giá trị mặc định phải là một hằng số; nó không thể là hàm hoặc biểu thức

+0

Không đúng, bạn có thể sử dụng getdate() –

+5

@amrosama - Không, bạn không thể. 'getdate()' thậm chí không phải là một hàm của MySQL. Liên kết trong câu trả lời giải thích ngoại lệ duy nhất: * «bạn có thể chỉ định CURRENT_TIMESTAMP làm mặc định cho cột TIMESTAMP» *. –

+0

CURRENT_TIMESTAMP là "hàm" duy nhất có thể được sử dụng làm giá trị mặc định. Mọi thứ khác phải là một hằng số (không may). –

16

Như đã nói, bạn không thể.

Nếu bạn muốn để mô phỏng hành vi này, bạn có thể sử dụng một kích hoạt theo cách này:

CREATE TRIGGER before_insert_app_users 
BEFORE INSERT ON app_users 
FOR EACH ROW 
    IF new.uuid IS NULL 
    THEN 
    SET new.uuid = uuid(); 
    END IF; 

Bạn vẫn phải cập nhật hàng tồn tại trước đó, như thế này:

UPDATE app_users SET uuid = (SELECT uuid()); 
+0

Tôi nhận được lỗi cú pháp với mã này. Dường như cuộc gọi tới uuid() không được phép trong khối FOR EACH ROW. Bất kỳ đề xuất? –

+1

Bạn đang sử dụng phiên bản nào của mysql? Tôi đã thử cú pháp này cho 5.5 và nó hoạt động. Thay vào đó, hãy thử thay thế 'uuid()' bằng '(SELECT uuid())' – Pamput

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