2013-08-23 20 views
14

Ho una tabella con una colonna che contiene alcuni valori nulli. Voglio aggiungere un vincolo NOT NULL a quella colonna senza aggiornare i valori null esistenti a un valore non null. Voglio mantenere i valori nulli esistenti e controllare le righe future che contengono un valore non nullo per questa colonna. È possibile? Come?Come aggiungere un vincolo non nullo alla colonna contenente valori nulli

+4

sembra un po 'pazzo da violare i propri vincoli. O è o non è permesso essere nullo. Di solito, quel tipo di, um, flessibilità è impostato nell'applicazione che alimenta il database, non nel database stesso. Facendo ciò che vuoi fare, in quel modo giace la follia. :) – railsdog

+0

Si potrebbe avere un trigger di inserimento/aggiornamento per rifiutare qualsiasi nuovo valore nullo. Ma nel complesso, sembra una cattiva idea. – Thilo

+0

Non pazzo affatto. L'ho usato occasionalmente nei sistemi in cui desideravano mantenere i dati esistenti (vecchi), ma inizia a controllare un vincolo per qualsiasi nuovo (o aggiornato) dato. –

risposta

35

È possibile aggiungere un vincolo non convalidato: non esaminerà le righe esistenti, ma verrà controllato per tutte le righe nuove o aggiornate.

ALTER TABLE mytable MODIFY mycolumn NOT NULL NOVALIDATE; 

Basta essere consapevoli del fatto che non sarà possibile aggiornare una riga esistente a meno che non soddisfi il vincolo.

Inoltre, essere consapevoli del lato negativo che l'ottimizzatore non sarà in grado di sfruttare questo vincolo nel fare i suoi piani - si deve supporre che alcune righe possano ancora avere un nulla.

+0

Potrebbe fornire qualche link esterno per ulteriori riferimenti? Grazie! – Rachcha

+1

Cosa cerchi in particolare? Documenti: http://docs.oracle.com/cd/E11882_01/server.112/e41084/clauses002.htm#i1002273 –

-1

ALTER TABLE nome_tabella SET nome_colonna = '0' WHERE nome_colonna È NULL;

ALTER TABLE nome_tabella MODIFICA COLONNA (nome_colonna NUMERO CONSTRAINT identificativo_richiesta NON NULL);

Si presume ovviamente che la colonna sia un numero ma in realtà è la stessa cosa, si dovrebbe semplicemente cambiare lo "0" con un valore predefinito che non è nullo.

0

Hammad: Affronto il problema e risolverlo come segue:

tabella Alter thr_empl_info modificare THR_EM_DESIGNATION_ID non nullo