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.