Modifica di una colonna: da null a non null


1217

Ho una tabella che ha diverse colonne di numeri interi nullable. Questo è indesiderabile per diversi motivi, quindi sto cercando di aggiornare tutti i valori null su 0 e quindi impostare queste colonne su NOT NULL. Oltre a modificare i null in 0, i dati devono essere conservati.

Sto cercando la sintassi SQL specifica per modificare una colonna (chiamarla ColumnA) a " not null". Supponiamo che i dati siano stati aggiornati per non contenere valori null.

Utilizzando SQL Server 2000 .


16
Un'altra cosa - potresti voler aggiungere un valore predefinito a tutti gli inserimenti esistenti che non specificano la colonna non falliscono: ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
Marc Gravell

4
Inoltre, potresti essere sorpreso di sapere che in alcune circostanze la modifica di una colonna NOT NULLpuò causare molte registrazioni.
Martin Smith,

Risposte:


2012

Innanzitutto, fai NULLscomparire tutti i valori correnti :

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL

Quindi, aggiorna la definizione della tabella per non consentire "NULL":

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL

49
Consentitemi di aggiungere valore alle due risposte corrette sopra. La semantica di NULL può avere alcuni significati. Uno dei significati comuni è SCONOSCIUTO. Prendi SCORE come esempio. Un PUNTEGGIO null e un PUNTEGGIO ZERO sono un mondo di differenza! Prima di aver fatto le raccomandazioni di cui sopra. Assicurarsi che l'applicazione non prenda null nella sua logica aziendale.
TechTravel

242
Effettua prima il backup del database nel caso in cui tu faccia un refuso e il tuo DB esploda.
Aprire il

20
È strano che MS SQL Management Studio non consenta tale opzione, si vanta di "Dropping table ..."
Sebastian

14
È necessario eseguire sempre il backup dei database. Non si sa mai quando una delle persone potrebbe scrivere e aggiornare o cancellare la dichiarazione e dimenticare la clausola WHERE.
Fiume Vivian,

2
@SebastianGodelet: esiste un'impostazione che ti consente di disattivare quell'avvertimento o farlo in modo che non ti impedisca di modificare la tabella. In alcuni casi, per modificare lo schema di una tabella è necessario creare una nuova tabella, eliminare i dati copiati dalla vecchia e dalla vecchia. Poiché un errore in questo processo potrebbe causare la perdita di dati, SSMS ti avvisa e, per impostazione predefinita, ti impedisce di farlo.
siride,

57

Ho avuto lo stesso problema, ma il campo usato per impostazione predefinita è null, e ora voglio impostarlo su 0. Ciò ha richiesto l'aggiunta di un'altra riga dopo la soluzione di mdb:

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];

Questo non risponde al problema. L'impostazione predefinita è già impostata, è NOT NULL che deve essere modificato. Con solo la tua risposta, tutti i record esistenti rimarranno NULL e il problema rimane.
PandaWood,

6
Hai letto la parte "Aggiunta di un'altra riga"? Come in, questo è in aggiunta alla risposta sopra?
Greg Dougherty,

7
In realtà, no non è chiaro che "aggiungere un'altra riga" significa "in aggiunta alla risposta sopra" (specialmente perché ci sono molte risposte "sopra") - se questo è ciò che intendevi, allora il testo deve davvero cambiare e dovresti includi la riga della risposta a cui ti riferisci
PandaWood,

2
Volevo solo intervenire e dire che è una buona idea nominare esplicitamente i tuoi vincoli, valori predefiniti inclusi. Se hai mai bisogno di rilasciare una colonna, devi conoscere il nome del vincolo da eliminare prima di poterlo fare. Ci siamo imbattuti in questo nelle nostre migrazioni di DB alcune volte. So che l'esempio lo include qui, ma è ancora un posto in cui alcuni sviluppatori escono perché il nome non è richiesto.
Giocate il

38

Dovrai farlo in due passaggi:

  1. Aggiorna la tabella in modo che non vi siano null nella colonna.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Modifica la tabella per modificare la proprietà della colonna
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

27

Per Oracle 11g, sono stato in grado di modificare l'attributo della colonna come segue:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

Altrimenti la risposta di abatichev sembrava buona. Non puoi ripetere l'alter - si lamenta (almeno in SQL Developer) che la colonna non sia già nulla.


Sembra che in Oracle 11 non sia necessario ripetere il datatype. Basta columname NOT NULLsolo. Vedere la documentazione .
jpmc26

18

questo ha funzionato per me:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;

16

Finché la colonna non è un identificatore univoco

UPDATE table set columnName = 0 where columnName is null

Poi

Modificare la tabella e impostare il campo su non null e specificare un valore predefinito pari a 0


4

questo sembra più semplice, ma funziona solo su Oracle:

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;

inoltre, con questo, puoi anche aggiungere colonne, non solo modificarlo. Si aggiorna al valore predefinito (0) in questo esempio, se il valore era null.


sì, ma google dirige le persone qui .. Ha ricevuto molti voti positivi e molti voti negativi. Penso che sia utile. Tutti sono liberi di ignorarlo, ma onestamente penso e vedo che questo aiuta le persone.
csomakk,

Per favore, leggi le regole SO. Come scrivo una buona risposta? , RISPOSTA ALLE DOMANDE TECNICHE AIUTAMENTE e Scrivi la domanda perfetta . Note: Non abbiate paura di eliminare (o modificare pesantemente) risposte inutili e non “rispondere ed eseguire
Kiquenet,

4

In caso di FOREIGN KEY CONSTRAINT ... ci sarà un problema se '0' non è presente nella colonna della tabella delle chiavi primarie. La soluzione per questo è ...

PASSO 1:

Disabilita tutti i vincoli usando questo codice:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

PASSO 2:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)

Fase 3:

Abilita tutti i vincoli usando questo codice:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

4

Nel mio caso ho avuto difficoltà con le risposte pubblicate. Ho finito per usare il seguente:

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

Passa VARCHAR(200)al tipo di dati e, facoltativamente, modifica il valore predefinito.

Se non si dispone di un valore predefinito, si verificherà un problema durante l'esecuzione di questa modifica, in quanto l'impostazione predefinita sarebbe nulla durante la creazione di un conflitto.


1

Facciamo un esempio:

TABLE NAME=EMPLOYEE

E voglio cambiare la colonna EMPLOYEE_NAME in NOT NULL. Questa query può essere utilizzata per l'attività:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

Ti preghiamo di non urlare e utilizzare la formattazione per renderti più leggibile. Ad esempio, aiutare a riconoscere la parte di codice. stackoverflow.com/editing-help
Yunnosch

Inoltre, ti preghiamo di non scrivere testi più lunghi in maiuscolo. Si considera gridare su Internet
Zoe,

1
@PawanTiwari si prega di apportare modifiche complete. Non sembra che tu abbia risolto tutti i problemi del post. La maggior parte è in maiuscolo.
doppio segnale acustico

@ doppio segnale acustico, lo terrò a mente. Grazie
Pawan Tiwari il

A parte i problemi di formattazione, rendi più ovvio quale approfondimento aggiuntivo fornisce la tua risposta, rispetto ad esempio alle risposte più vecchie di Ralph Wiggum, JDM, Rashmi Singh e trooper31, che sembrano funzionalmente identiche a prima vista. Sembra quindi necessario sottolineare i punti più fini della tua soluzione. Cerca di evitare l'impressione di copiare solo le risposte ...
Yunnosch,

0

Per il javaDB integrato incluso nel JDK (distribuzione supportata da Oracle di Apache Derby) il seguito ha funzionato per me

alter table [table name] alter column [column name] not null;

0

Rendere la colonna non nulla e aggiungere l'impostazione predefinita può essere eseguita anche nella GUI di SSMS.

  1. Come altri hanno già affermato, non è possibile impostare "non null" fino a quando tutti i dati esistenti non sono "non null" in questo modo:

UPDATE myTable SET myColumn = 0

  1. Fatto ciò, con la tabella in visualizzazione struttura (fare clic con il pulsante destro del mouse sulla tabella e fare clic su "visualizzazione struttura"), è possibile deselezionare le colonne Consenti Null in questo modo:

inserisci qui la descrizione dell'immagine

  1. Sempre nella vista di progettazione con la colonna selezionata, puoi vedere le Proprietà della colonna nella finestra in basso e impostare il valore predefinito su 0 lì dentro così:

inserisci qui la descrizione dell'immagine


Vedo il downvote ma non riesco a correggere nulla senza feedback. Per favore fatemi sapere se qualcosa non ha funzionato.
Tony L.

-1

È possibile modificare la definizione della colonna DB esistente utilizzando il seguente sql.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.