2012-03-17 3 views
13

Quando creo una tabella con una colonna timestamp, quella colonna è magicamente definita come NOT NULL DEFAULT CURRENT_TIMESTAMP sull'aggiornamento CURRENT_TIMESTAMP. Ignorando quanto sia strano, mi piacerebbe cambiarlo in modo da non avere impostazioni predefinite e nessun comportamento speciale "in aggiornamento".È possibile definire una colonna timestamp che non sia nullo e che non abbia impostazioni predefinite e nessun comportamento speciale in fase di aggiornamento?

Ho scoperto che se cambio la colonna in NULL, l'impostazione predefinita è magicamente impostata su NULL e "on update" scompare magicamente. Questo è fantastico, tuttavia vorrei che la colonna fosse NOT NULL. Quando lo cambio, sia il default che "on update" (impostato su CURRENT_TIMESTAMP) riappaiono magicamente.

So che potrei usare datetime anziché timestamp, ma sono interessato a timestamp perché è timezone-aware (sembra essere come "timestamp con fuso orario" in Postgres).

risposta

-1

Non molto tempo fa ho trovato una soluzione davvero bella che potrebbe aiutarti. Disable ON UPDATE

5

Le colonne di sovrimpressione sono un caso speciale. Vedere here: per impostazione predefinita, le colonne TIMESTAMP NON sono NULL, non possono contenere valori NULL e l'assegnazione di NULL assegna il timestamp corrente.

Per informazioni più dettagliate leggere su Data Type Default Values.

In particolare, questa situazione si applica quando non si esegue in modalità rigorosa. Se si esegue in modalità rigorosa, l'inserimento di un valore NULL genera un errore.

Questo dovrebbe prendersi cura di esso:

ALTER TABLE tableName ALTER COLUMN columnName DROP DEFAULT; 

Se questo non funziona, facendo questo si suppone che lasciarvi con il default (facilmente sovrascritto), ma rimuovere l'aggiornamento su:

ALTER TABLE tableName CHANGE columnName columnName NOT NULL DEFAULT CURRENT_TIMESTAMP; 

Annotare il nome della colonna ripetuta.

+1

Hmm, interessante. Sono stato in grado di farlo: 'alter table tstest modify ts timestamp non null default 0;' e successivamente: 'alter table tstest alter column ts drop default;' Sembra dare i risultati che volevo. Mi chiedo se ci sia un modo più diretto, idealmente nella dichiarazione della tabella di creazione. – aditsu

+0

Quindi per ora posso farlo in 2 passaggi: creare tabella (con 0 predefinito) e quindi rilasciare il valore predefinito. Ma la cosa strana è che se provo a inserire un valore nullo, usa ancora il timestamp corrente (e se non specifichi un valore, usa 0). mysql, non hai senso? – aditsu

+0

Sembra essere un caso speciale. Vedi [qui] (http://dev.mysql.com/doc/refman/5.1/en/timestamp-initialization.html): _Per impostazione predefinita, le colonne TIMESTAMP NON sono NULL, non possono contenere valori NULL e l'assegnazione di NULL assegna l'attuale timestamp._ – Ilion