ここではかなりストレートな質問ですが、これはうまくいくはずですが、そうではありません。それはなぜですか?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
句をサポートしていないので、それは動作しませんが、列のデフォルト値を指定します。 1つの例外を除き、デフォルト値は定数でなければなりません。関数または式にすることはできません。これは、たとえば、日付列のデフォルトをNOW()
またはCURRENT_DATE
などの関数の値に設定できないことを意味します。例外は、デフォルト値として、動的機能を使用することはできません、他の答えが正しく指摘するとして、あなたはTIMESTAMP
列
のデフォルトとしてCURRENT_TIMESTAMP
を指定することができるということです。あなたはCURRENT_TIMESTAMP
属性でTIMESTAMP
を使用することができますが、これは常に可能ではない、たとえばあなたが作成と更新タイムスタンプの両方を維持したい場合、あなたは第二のためにのみ許可されTIMESTAMP
列を必要とするだろう。
この場合、use a trigger insteadです。
自動タイムスタンプの数の制限が解除されました(http: /dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html)。 –
追加してくれてありがとうございました。それは気づいていませんでした。ほとんどのウェブホスティングはまだ5.1または5.5になっていますので、心に留めておいてください。 –
MariaDB 10.2.1は 'DEFAULT(expression)'を許可します。 [Create table](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:yep、 'DATE_FORMAT'を使用して – zerkms
それは2016年であり、正に、これがまだ成立しているという事実はばかげている。私は定数同義語の全理由が非定型表現が禁止されている場所でそれらを許可することだと思った。 – Dan