2008-11-19 35 views
6

Tôi có bảng sau trong MySQL (phiên bản 5):MySQL: thêm năm nay như một giá trị mặc định cho một trường 'năm'

id int(10)  UNSIGNED    No auto_increment     
year varchar(4) latin1_swedish_ci No    
title varchar(250) latin1_swedish_ci Yes NULL   
body text   latin1_swedish_ci Yes NULL 

Và tôi muốn các db để tự động thêm năm hiện hành về chèn , tôi đã thử các câu lệnh SQL sau:

ALTER TABLE `tips` CHANGE `year` `year` VARCHAR(4) NOT NULL DEFAULT year(now()) 

Nhưng nó mang lại cho các lỗi sau:

1067 - Invalid default value for 'year' 

tôi có thể làm gì để có được niềm vui này ctionality? Cảm ơn trước!

@ gabriel1863: Cảm ơn bạn đã trả lời nhưng vẫn nhận được lỗi tương tự. Ngay cả khi tôi sử dụng backticks trên trường năm.

Cảm ơn tất cả vì sự giúp đỡ!

+0

có cột với tên giống như một kiểu dữ liệu thường là một ý tưởng thực sự BAD – warren

Trả lời

14

The DEFAULT value clause in a data type specification indicates a default value for a column. With one exception, the default value must be a constant; it cannot be a function or an expression. This means, for example, that you cannot set the default for a date column to be the value of a function such as NOW() or CURRENT_DATE. The exception is that you can specify CURRENT_TIMESTAMP as the default for a TIMESTAMP column.

-- MySQL Manual

Bạn có thể, tuy nhiên, hãy viết một trigger đó đặt giá trị. Tôi ước tôi có thể giúp, nhưng tôi không thực sự quen thuộc với việc viết các thủ tục lưu sẵn trong MySQL.

Tôi nghĩ rằng điều này sẽ làm việc:

CREATE TRIGGER ins_year 
BEFORE INSERT ON tips 
    FOR EACH ROW SET NEW.year = YEAR(NOW()); 
7

Sau đây nên làm việc:

ALTER TABLE tips MODIFY COLUMN year YEAR(4) NOT NULL DEFAULT CURRENT_TIMESTAMP 

Xin xem Year Data Type để biết thêm thông tin.

Vì vậy, tôi đã thử nghiệm điều này khi tôi đã truy cập và nó không hoạt động. Vì một áp phích khác đã chỉ ra CURRENT_TIMESTAMP chỉ hoạt động trên loại dữ liệu TIMESTAMP.

Có vấn đề cụ thể nào khi lưu trữ dấu thời gian hoàn chỉnh và sau đó chỉ sử dụng năm trong mã của bạn? Nếu không, thì tôi khuyên bạn nên lưu trữ giá trị này làm dấu thời gian.

tùy chọn khác của bạn sẽ tạo ra một trigger:

CREATE TRIGGER example_trigger AFTER INSERT ON tips 
FOR EACH ROW BEGIN 
UPDATE tips SET year = YEAR(NOW()) WHERE tip_id = NEW.tip_id 
END; 

Nếu không, gán giá trị này để tuyên bố INSERT từ bên trong mã của bạn.

Giải pháp tốt nhất trong trường hợp của bạn sẽ phụ thuộc hoàn toàn vào hoàn cảnh xung quanh đơn đăng ký cụ thể của bạn.

+0

đẹp, tôi đang tìm kiếm chính xác những điều tương tự ngày hôm nay! – Tom

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