2010-10-22 9 views
44

Posso aggiungere una colonna che è a specificare come NOT NULL, non voglio specificare il valore di default, ma MS-SQL 2005 dice:Posso aggiungere una colonna NOT NULL senza valore di DEFAULT,

ALTER TABLE consente solo di aggiungere colonne che possono contenere valori null o specificare una definizione DEFAULT oppure la colonna da aggiungere è una colonna Identity o Timestamp o, in alternativa, se nessuna delle condizioni precedenti è soddisfatta, la tabella deve essere vuota per consentire l'aggiunta di questa colonna. Il "test" della colonna non può essere aggiunto alla "lista di spedizione" della tabella non vuota perché non soddisfa queste condizioni.

Se SÌ, per favore fammi sapere la sintassi, se No per favore specifica il motivo.

risposta

59

No, non è possibile.

Perché se fosse possibile, SQL non saprebbe cosa mettere come valore nei record già esistenti. Se non avessi alcun record nella tabella, funzionerebbe senza problemi.

Il modo più semplice per eseguire questa operazione è creare la colonna con un valore predefinito e quindi rimuovere il valore predefinito.

Un'altra alternativa sarebbe quella di aggiungere la colonna senza il vincolo, riempire i valori per tutte le celle e aggiungere il vincolo.

8

No - SQL Server rifiuta del tutto ragionevolmente, perché non saprebbe quale valore righe esistenti dovrebbero avere

E 'facile creare un DEFAULT, allo stesso tempo, e poi subito a cadere.

18

Aggiungere la colonna alla tabella, aggiornare le righe esistenti in modo che nessuna di esse sia nullo e quindi aggiungere un vincolo "non nullo".

+3

Si tratta di una soluzione migliore di creare/eliminare l'impostazione predefinita, se il la logica per i nuovi valori è più complessa di una semplice costante. –

+0

Perché, o come, è forse meglio aggiornare (manualmente?) + Passare a "non nullo, invece di" aggiornare "automaticamente tramite predefinito + cambiando a" no predefinito "(impostazione predefinita)? –

+0

@ vgv8 - cosa succede se il i nuovi valori in ogni riga dipendono da altre colonne già presenti nella riga? Non è possibile esprimerlo tramite un vincolo predefinito. –

0

No.

Basta usare stringa vuota '' (in caso di tipo di carattere) o 0 (se numerico), ecc come valore di DEFAULT,

0

No, non è possibile, come SQL Server, o qualsiasi altri motori di database forzeranno questa nuova colonna a essere nullo per le righe esistenti nella tabella dei dati. Ma poiché non si consente un NULL, è necessario fornire un valore predefinito per rispettare il proprio vincolo. Questo è di grande significato! Il DBE non estrapolerà un valore per valori non nulli per le righe esistenti.

+0

Mentre quello che dici ha senso, non è vero che almeno un "motore di database" sia MS Access, il che permette di avere una colonna 'NOT NULL' aggiunto a una tabella senza specificare anche un 'DEFAULT', il r esult di cui valori nulli in una colonna 'NOT NULL'. Fornirò la prova come risposta ... – onedaywhen

0

@Damien_The_Unbeliever's comment, E 'aggiunta colonna calcolata? Né la domanda né la risposta implicavano qualcosa del genere. In caso di colonna calcolata gli stati di errore:

"Solo vincoli UNIQUE o PRIMARY KEY può essere creato su colonne calcolate, mentre il check, chiave esterna e vincoli NOT NULL richiedono che le colonne calcolate essere persistenti"

OK, se continuare questo gioco d'ipotesi, qui è il mio script che illustra l'aggiunta di colonna "NOT NULL" in uno "ALTER TABLE" step:

CREATE TABLE TestInsertComputedColumn 
(
    FirstName VARCHAR(100), 
    LastName CHAR(50) 
); 

insert into TestInsertComputedColumn(FirstName,LastName) 
    select 'v', 'gv8'; 
select * from TestInsertComputedColumn; 

ALTER TABLE TestInsertComputedColumn 
     ADD FullName As FirstName + LastName PERSISTED NOT NULL; 

select * from TestInsertComputedColumn; 
--drop TABLE TestInsertComputedColumn; 
1

No non si può.Ma si può prendere in considerazione per specificare il valore di default di ('')

1

Io uso questo metodo per inserire colonna NOT NULL senza valore predefinito

ALTER TABLE [Table] ADD [Column] INT NULL 
GO 
UPDATE [Table] SET [Column] = <default_value> 
ALTER TABLE [Table] ALTER COLUMN [Column] INT NOT NULL 
Problemi correlati