2010-10-25 11 views
42

se uso una migrazione per aggiornare un database, e aggiungo un campo intero come questo:Come: default => 0 e: null => false differiscono per i campi integer nelle migrazioni?

t.integer :foo :default => 0, :null => false 

Qual è lo stato di default del record esistenti e nuovi nel database? Spero che la risposta sia: - Entrambi rileggeranno foo come 0.

È default => 0 necessario, se ho: null => falso?

Sto solo cercando di capire la differenza tra i due ...

+6

dipende dal database. Non rotaie. – shingara

risposta

87

:null => false dice il database non accettare NULL valori.

:default => 0 fa due cose:

  1. dire al vostro database da utilizzare '0' come il valore predefinito quando NULL o nulla è specificato in una query.
  2. Dire ai binari di usare '0' come valore predefinito quando si crea un nuovo oggetto.

Il punto 2 si assicura che quando si salva il nuovo oggetto, si disponga effettivamente di un valore valido.

Per rispondere alla tua domanda: Se non si desidera valori NULL nel database, impostare :null => false, altrimenti utilizzare solo il parametro :default. Intendiamoci, '0' e NULL non sono le stesse cose.

Il mancato valore di NULL potrebbe essere importante ai fini dell'indicizzazione o se è necessario fornire l'accesso diretto al database a una terza parte.

+0

Con questo, intendi che verrà riletto come 0 se ho un record di database esistente prima della migrazione? Quindi se faccio Table.value, su un vecchio record, il valore sarà == 0? – cmaughan

+0

Sì. Se si dispone di una colonna della tabella che contiene valori 'NULL', ma si imposta un valore predefinito, verrà restituito quello predefinito. – Ariejan

+1

Questa è l'illuminante, preziose informazioni: "Non avere valori NULL potrebbe essere importante ai fini dell'indicizzazione o se è necessario fornire accesso diretto al database a una terza parte." – ahnbizcad

Problemi correlati