Domanda piuttosto semplice qui, penso che questo dovrebbe funzionare ma non lo è. Perché no?CURRENT_DATE/CURDATE() non funziona come valore predefinito DATE
CREATE TABLE INVOICE(
INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)
Domanda piuttosto semplice qui, penso che questo dovrebbe funzionare ma non lo è. Perché no?CURRENT_DATE/CURDATE() non funziona come valore predefinito DATE
CREATE TABLE INVOICE(
INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)
Non funziona perché non è supportato
La clausola
DEFAULT
specifica un valore predefinito per una colonna. Con un'eccezione, il valore predefinito deve essere una costante; non può essere una funzione o un'espressione. Ciò significa, ad esempio, che non è possibile impostare l'impostazione predefinita per una colonna della data come valore di una funzione comeNOW()
oCURRENT_DATE
. L'eccezione è che è possibile specificareCURRENT_TIMESTAMP
come predefinito per una colonna diTIMESTAMP
Come l'altra risposta nota correttamente, non è possibile utilizzare le funzioni dinamiche come valore di default. Si potrebbe utilizzare TIMESTAMP
con l'attributo CURRENT_TIMESTAMP
, ma questo non è sempre possibile, per esempio, se si desidera mantenere sia un creazione e aggiornato timestamp, e avresti bisogno l'unica consentita TIMESTAMP
colonna per il secondo.
In questo caso, use a trigger instead.
La restrizione sul numero di timestamp automatici è stata revocata [in MySQL 5.6] (http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html). –
Grazie per l'aggiunta, non era a conoscenza di ciò - ancora buono da tenere presente poiché la maggior parte del webhosting è ancora a 5.1 o 5.5. –
MariaDB 10.2.1 consente 'DEFAULT (espressione)'. Vedi [Crea tabella] (https://mariadb.com/kb/en/mariadb/create-table/). –
dichiarare la colonna della data come NOT NULL, ma senza un valore predefinito. Quindi aggiungere questo trigger:
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 ;
Ho dovuto impostare il campo su 'NULL' per fare in modo che funzionasse, altrimenti inseriva invece' 0000-00-00'. MySQL v5.6.12. – lolbas
È possibile formattare il valore di data/ora solo su una data? – inControl
@inControl: sì, usando 'DATE_FORMAT' – zerkms
È il 2016 e, onestamente, il fatto che questo sia ancora vero è ridicolo. Ho pensato che l'intera ragione per i sinonimi costanti era quella di consentire loro di vietare in posti in cui le espressioni non costanti. – Dan