這裏非常簡單的問題,我認爲這應該可以工作,但它不會。爲什麼不呢?CURRENT_DATE/CURDATE()不能用作默認的DATE值
CREATE TABLE INVOICE(
INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)
這裏非常簡單的問題,我認爲這應該可以工作,但它不會。爲什麼不呢?CURRENT_DATE/CURDATE()不能用作默認的DATE值
CREATE TABLE INVOICE(
INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)
它不起作用,因爲它不支持
的
DEFAULT
子句指定的列的默認值。有一個例外,默認值必須是常數;它不能是一個函數或表達式。這意味着,例如,您不能將日期列的默認值設置爲函數的值,例如NOW()
或CURRENT_DATE
。唯一的例外是,您可以指定CURRENT_TIMESTAMP
作爲默認的TIMESTAMP
列
至於對方的回答正確地指出,你不能使用動態功能作爲默認值。您可以使用TIMESTAMP
和CURRENT_TIMESTAMP
屬性,但這並不總是可行的,例如,如果要保留創建和更新時間戳,並且您需要第二個唯一允許的TIMESTAMP
列。
在這種情況下,use a trigger instead。
對自動時間戳數量的限制已被解除[在MySQL 5.6中](http:///dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html)。 –
感謝您的補充,沒有意識到這一點 - 仍然需要記住,因爲大多數虛擬主機仍然是5.1或5.5。 –
MariaDB 10.2.1允許'DEFAULT(表達式)'。請參閱[創建表格](https://mariadb.com/kb/en/mariadb/create-table/)。 –
將您的日期列聲明爲NOT NULL,但沒有默認值。然後添加此觸發器:
USE `ddb`;
DELIMITER $$
CREATE TRIGGER `default_date` BEFORE INSERT ON `dtable` FOR EACH ROW
if (isnull(new.query_date)) then
set new.query_date=curdate();
end if;
$$
delimiter ;
我不得不將字段設置爲'NULL'來完成這個工作,否則它會插入'0000-00-00'。 MySQL v5.6.12。 – lolbas
是否可以將時間戳值的格式設置爲僅限日期? – inControl
@inControl:是的,使用'DATE_FORMAT' – zerkms
這是2016年,說實話,這仍然是真實的事實是荒謬的。我認爲常量同義詞的全部原因是讓它們在非常量表達式中被禁止。 – Dan