Jak zmienić typ danych kolumny w bazie danych SQL bez utraty danych


198

Mam bazę danych SQL Server i właśnie zdałem sobie sprawę, że mogę zmienić typ jednej z kolumn z intna bool.

Jak mogę to zrobić bez utraty danych, które zostały już wprowadzone do tej tabeli?


3
Czy próbowałeś utworzyć nową kolumnę bitową, kopiując wartości ze starej kolumny do nowej, usuwając starą i zmieniając nazwę nowej? Wszystko to w transakcji, oczywiście, w celu przywrócenia problemów.
Radu Caprescu

2
Mówisz „Właśnie zdałem sobie sprawę, że mogę zmienić typ z jednej kolumny z int na bool”. Nie ma typu logicznego. Jest jednak trochę. Zastanawiasz się, jak to zrobić (jak już wspomniano 2 odpowiedzi). A może twoje pytanie „Właśnie zdałem sobie sprawę, że to możliwe - w jaki sposób SQL Server to robi?”
Martin Smith

Odpowiedzi:


329

Możesz to łatwo zrobić za pomocą następującego polecenia. Każda wartość 0 zostanie zamieniona na 0 (BIT = fałsz), wszystko inne zostanie zamienione na 1 (BIT = prawda).

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

Inną opcją byłoby utworzenie nowej kolumny typu BIT, wypełnienie jej ze starej kolumny, a kiedy skończysz, upuść starą kolumnę i zmień nazwę nowej na starą. W ten sposób, jeśli coś podczas konwersji pójdzie nie tak, zawsze możesz wrócić, ponieważ nadal masz wszystkie dane.


10
Innymi słowy: NULLpozostaje NULL, 0staje się False, niezerowe wartości (1, -1, 1999, -987 ...) stają się True.
Álvaro González

2
I nigdy nie wprowadzaj takich zmian w GUI. Zawsze przechodź przez taki skrypt. GUI usunie i ponownie utworzy tabelę, co zajmuje dużo więcej czasu. Jeśli stół jest duży i produkowany, może to być katastrofalne. Ponadto wszystkie zmiany w tabeli powinny mieć skrypt, który jest w kontroli źródła, tak jak każdy inny kod.
HLGEM

1
Chciałbym dodać, upewnij się, że masz bieżącą kopię zapasową bazy danych przed wprowadzeniem jakichkolwiek zmian strukturalnych w tabeli z danymi. I nie uruchamiaj takiej zmiany podczas produkcji w godzinach szczytu, jeśli stół jest często używany lub duży.
HLGEM

Błędnie zatwierdziłem zmiany ... muszę je odrzucić ... ponieważ nie ma tam ulepszeń ... Ans jest perfekcyjny.
Vikash Pathak,

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Uwaga: jeśli istnieje rozmiar kolumn, po prostu wpisz również rozmiar.


20

Jeśli jest to poprawna zmiana.

możesz zmienić właściwość.

Narzędzia -> Opcje -> Projektanci -> Projektanci tabel i baz danych -> Odznacz -> Zapobiegaj zapisywaniu zmian, które wymagały ponownego utworzenia tabeli.

Teraz możesz łatwo zmienić nazwę kolumny bez ponownego tworzenia tabeli lub utraty swoich rekordów.


5
W żadnym wypadku nie powinieneś wprowadzać zmian w tabeli za pomocą GUI. Spowoduje to całkowite odtworzenie tabeli zamiast używania opcji Zmień tabelę, a to spowoduje problem, jeśli ją odznaczycie, a tabela będzie duża. Ponadto powinieneś mieć wszystkie zmiany w tabelach w skrypcie w kontroli źródła.
HLGEM

Przyjrzyj się bliżej tej opcji - wyłącza zabezpieczenia, które zapobiegną upuszczeniu interfejsu przez GUI. Wygląda na to, że nie stracisz danych, ponieważ GUI odtworzy tabelę, ale na serwerze będzie to kopiowanie / upuszczanie. Jeśli więc w tabeli jest dużo danych, spowoduje to bardzo dużą operację. Także ja myślę (nie pozytywne), który występuje w jednej transakcji, dlatego można wypełnić swój dziennik transakcji.
JMarsch

1
Chyba chciałbym dodać trochę wyjaśnienia do mojego poprzedniego komentarza. Jeśli robisz to tylko na swoim komputerze programistycznym, prawdopodobnie nic ci nie jest. Ale nie radzę używać tej metody w produkcyjnej bazie danych - szczególnie jeśli jest to misja o kluczowym znaczeniu.
JMarsch

8

Jak myślisz, dlaczego stracisz dane? Wystarczy przejść do Management Studio i zmienić typ danych. Jeśli istniejącą wartość można przekonwertować na bool (bit), zrobi to. Innymi słowy, jeśli „1” odwzoruje na true, a „0” odwzoruje na false w oryginalnym polu, nic ci nie będzie.


1
Jeśli masz dane w tabeli, to nie zadziała. Podczas próby zmiany typu kolumny SMS twierdzi, że najpierw musi upuścić tabelę ... co oczywiście jest nieprawidłowe, ponieważ polecenie ALTER TABLE ... ALTER COLUMN działa dobrze, nawet w przypadku pól innych niż NULL. Właśnie dlatego myśleli, że mogą utracić dane.
Tony O'Hagan

1
@ TonyO'Hagan To nieprawda. Możesz wyłączyć ostrzeżenie, a będzie ono działać dobrze z istniejącymi danymi. Zobacz także stackoverflow.com/questions/2947865/…
Philippe Leybaert

1
Ok fajnie! Nie wiedziałem tego. Właśnie próbowałem zagłosować na ciebie (z powrotem), ale SO mnie powstrzymuje, chyba że zmienisz swoją odpowiedź. Być może drobna zmiana i mogę to zrobić;).
Tony O'Hagan

1
W żadnym wypadku nie powinieneś wprowadzać zmian w tabeli za pomocą GUI. Spowoduje to całkowite odtworzenie tabeli zamiast używania opcji Zmień tabelę, a to spowoduje problem, jeśli ją odznaczycie, a tabela będzie duża. Ponadto powinieneś mieć wszystkie zmiany w tabelach w skrypcie w kontroli źródła.
HLGEM

Pod żadnym pozorem. Nigdy nie ma powodu, aby używać GUI do projektowania tabeli lub ich zmiany, i dobre powody, aby tego nie robić. Wszystkie zmiany muszą być w skryptach, aby mogły się rozprzestrzeniać na inne serwery i traktowane jak kod, który faktycznie znajdują się w kontroli źródła.
HLGEM

5

jeśli używasz T-SQL (MSSQL); powinieneś wypróbować ten skrypt:

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

jeśli używasz MySQL; powinieneś wypróbować ten skrypt:

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

jeśli korzystasz z Oracle; powinieneś wypróbować ten skrypt:

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

3

Idź do Tool-Option-designer-Table and Database designer i Odznacz opcję Zapobiegaj zapisywaniuwprowadź opis zdjęcia tutaj


1
W żadnym wypadku nie powinieneś wprowadzać zmian w tabeli za pomocą GUI. Spowoduje to całkowite odtworzenie tabeli zamiast używania opcji Zmień tabelę, a to spowoduje problem, jeśli ją odznaczycie, a tabela będzie duża. Ponadto powinieneś mieć wszystkie zmiany w tabelach w skrypcie w kontroli źródła.
HLGEM

2

Zmień typ danych kolumny z typem kontroli kolumny:

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

dla mnie, na serwerze SQL 2016, robię to w ten sposób

* Aby zmienić nazwę kolumny Kolumna1 na Kolumna2

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

* Aby zmodyfikować typ kolumny z ciągu na int :( Upewnij się, że dane mają poprawny format )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

W wersji kompaktowej automatycznie przyjmuje rozmiar dla typu danych datetime, tj. (8), więc nie ma potrzeby ustawiania wielkości pola i generowania błędu dla tej operacji ...


-2

Mogę zmodyfikować typ danych pola tabeli za pomocą następującego zapytania: a także w Oracle DB,

ALTER TABLE table_name
MODIFY column_name datatype;

Not in
SQl

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.