Come modificare il tipo di dati di colonna nel database SQL senza perdere dati


198

Ho un database SQL Server e ho appena capito che posso cambiare il tipo di una delle colonne da inta bool.

Come posso farlo senza perdere i dati già inseriti in quella tabella?


3
Hai provato a creare una nuova colonna di bit, copiando i valori dalla vecchia colonna in quella nuova, eliminando quella vecchia e rinominando quella nuova? Tutto questo in una transazione, ovviamente, per ripristinare i problemi.
Radu Caprescu,

2
Dici "Ho appena realizzato che posso cambiare il tipo da una delle colonne da int a bool" Non esiste un tipo di dati booleano. C'è poco però. Stai chiedendo come si può fare questo (come i 2 risposte finora hanno coperto). O è la tua domanda "Ho appena capito che è possibile: come fa SQL Server ?"
Martin Smith,

Risposte:


329

Puoi farlo facilmente usando il seguente comando. Qualsiasi valore di 0 verrà trasformato in 0 (BIT = false), qualsiasi altra cosa verrà trasformata in 1 (BIT = true).

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

L'altra opzione sarebbe quella di creare una nuova colonna di tipo BIT, compilarla dalla vecchia colonna e, una volta terminato, rilasciare la vecchia colonna e rinominare quella nuova con il vecchio nome. In questo modo, se qualcosa durante la conversione va storto, puoi sempre tornare indietro poiché hai ancora tutti i dati ..


10
In altre parole: NULLresti NULL, 0diventa False, valori diversi da zero (1, -1, 1999, -987 ...) diventano True.
Álvaro González,

2
E non apportare mai modifiche come questa dalla GUI. Fallo sempre attraverso una sceneggiatura come questa. L'interfaccia grafica verrà eliminata e ricreata la tabella e ciò richiede molto più tempo. Se il tavolo è grande e in produzione, questo può essere disastroso. Inoltre, tutte le modifiche alla tabella dovrebbero avere uno script nel controllo del codice sorgente come tutti gli altri codici.
HLGEM,

1
Vorrei aggiungere, è assicurarsi di disporre di un backup corrente del database prima di apportare qualsiasi modifica strutturale a una tabella con i dati. E non eseguire un cambiamento come questo sulla produzione durante le ore di punta se la tabella viene utilizzata di frequente o di grandi dimensioni.
HLGEM,

Ho erroneamente approvato le modifiche ... è necessario rifiutarle .. perché non ci sono miglioramenti ... Ans è perfetto.
Vikash Pathak,

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Nota: se esiste una dimensione di colonne, basta scrivere anche la dimensione.


20

Se si tratta di una modifica valida.

puoi cambiare la proprietà.

Strumenti -> Opzioni -> Designer -> Designer di tabelle e database -> Deseleziona -> Impedisci il salvataggio delle modifiche che richiedevano la ricostruzione della tabella.

Ora puoi facilmente cambiare il nome della colonna senza ricreare la tabella o perdere i tuoi record.


5
In nessun caso è necessario apportare modifiche alla tabella utilizzando la GUI. Verrà ricreata completamente la tabella anziché utilizzare Alter table e questo causerà un problema se si deseleziona questa opzione e la tabella è grande. Inoltre dovresti avere tutte le modifiche alle tabelle in uno script nel controllo del codice sorgente.
HLGEM,

Guarda più da vicino questa opzione: sta disattivando una sicurezza che impedirà alla GUI di abbandonare il tavolo. Non sembrerai perdere dati, perché la GUI ricrea la tabella, ma sul server sarà copia / eliminazione. Pertanto, se nella tabella sono presenti molti dati, si verificherà un'operazione molto grande. Inoltre, penso (non positivo) che si verifichi in una singola transazione, quindi è possibile compilare il registro delle transazioni.
JMarsch,

1
Immagino che vorrei aggiungere un piccolo chiarimento al mio commento precedente. Se lo stai facendo sulla tua macchina di sviluppo, probabilmente stai bene. Ma non consiglierei l'uso di questo metodo su un database di produzione, specialmente se si tratta di una missione critica.
JMarsch,

8

Perché pensi che perderai i dati? Basta andare in Management Studio e cambiare il tipo di dati. Se il valore esistente può essere convertito in bool (bit), lo farà. In altre parole, se "1" viene mappato su true e "0" su false nel campo originale, andrà tutto bene.


1
Se nella tabella sono presenti dati, ciò non funzionerà. Quando si tenta di modificare un tipo di colonna, SMS afferma che è necessario eliminare prima la tabella ... il che ovviamente non è corretto poiché il comando ALTER TABLE ... ALTER COLUMN funziona perfettamente anche per i campi non NULL. Questo è il motivo per cui hanno pensato di poter perdere dati.
Tony O'Hagan,

1
@ TonyO'Hagan Non è vero. Puoi disattivare l'avviso e funzionerà perfettamente con i dati esistenti. Vedere anche stackoverflow.com/questions/2947865/...
Philippe Leybaert

1
Ok bello! Non lo sapevo. Ho appena provato a votarti (indietro) ma SO mi sta impedendo a meno che tu non modifichi la tua risposta. Forse un piccolo cambiamento e posso farlo;).
Tony O'Hagan,

1
In nessun caso è necessario apportare modifiche alla tabella utilizzando la GUI. Verrà ricreata completamente la tabella anziché utilizzare Alter table e questo causerà un problema se si deseleziona questa opzione e la tabella è grande. Inoltre dovresti avere tutte le modifiche alle tabelle in uno script nel controllo del codice sorgente.
HLGEM,

In nessun caso. Non c'è mai motivo di usare la GUI per progettare la tabella o cambiarla e buoni motivi per non farlo. Tutte le modifiche devono essere negli script per essere in grado di propagarsi ad altri server e trattati come il codice in cui si trovano effettivamente nel controllo del codice sorgente.
HLGEM,

5

se si utilizza T-SQL (MSSQL); dovresti provare questo script:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

se usi MySQL; dovresti provare questo script:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

se usi Oracle; dovresti provare questo script:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)

3

Vai a Strumenti-Opzioni-designer-Tabella e Database designer e Deseleziona Impedisci salvataggio opzioneinserisci qui la descrizione dell'immagine


1
In nessun caso è necessario apportare modifiche alla tabella utilizzando la GUI. Verrà ricreata completamente la tabella anziché utilizzare Alter table e questo causerà un problema se si deseleziona questa opzione e la tabella è grande. Inoltre dovresti avere tutte le modifiche alle tabelle in uno script nel controllo del codice sorgente.
HLGEM,

2

Modifica il tipo di dati della colonna con il tipo di controllo della colonna:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

per me, in SQL Server 2016, lo faccio in questo modo

* Per rinominare la colonna da Colonna1 a colonna2

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* Per modificare il tipo di colonna da stringa a int :( Assicurarsi che i dati siano nel formato corretto )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

Nella versione compatta verranno automaticamente ridimensionate le dimensioni del tipo di dati datetime, ad esempio (8), quindi non è necessario impostare le dimensioni del campo e generare errori per questa operazione ...


-2

Posso modificare il tipo di dati del campo tabella, con le seguenti query: e anche nel DB Oracle,

ALTER TABLE table_name
MODIFY column_name datatype;

Non in SQL Server
HLGEM

-4

Sostituisci il tipo di dati senza perdere dati

alter table tablename modify columnn  newdatatype(size);
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.