2013-12-09 8 views

risposta

39

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 come NOW() o CURRENT_DATE. L'eccezione è che è possibile specificare CURRENT_TIMESTAMP come predefinito per una colonna di TIMESTAMP

http://dev.mysql.com/doc/refman/5.5/en/create-table.html

+0

È possibile formattare il valore di data/ora solo su una data? – inControl

+0

@inControl: sì, usando 'DATE_FORMAT' – zerkms

+7

È 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

2

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.

+1

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). –

+0

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. –

+0

MariaDB 10.2.1 consente 'DEFAULT (espressione)'. Vedi [Crea tabella] (https://mariadb.com/kb/en/mariadb/create-table/). –

18

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 ; 
+0

Ho dovuto impostare il campo su 'NULL' per fare in modo che funzionasse, altrimenti inseriva invece' 0000-00-00'. MySQL v5.6.12. – lolbas

Problemi correlati