Zmiana kolumny: zero na zero


1216

Mam tabelę z kilkoma zerowymi kolumnami liczb całkowitych. Jest to niepożądane z kilku powodów, dlatego chcę zaktualizować wszystkie wartości null na 0, a następnie ustawić te kolumny na NOT NULL. Oprócz zmiany wartości null na 0dane należy zachować.

Szukam konkretnej składni SQL, aby zmienić kolumnę (nazwać ją ColumnA) na „ not null”. Załóżmy, że dane zostały zaktualizowane i nie zawierają wartości null.

Korzystanie z SQL Server 2000 .


16
Jeszcze jedno - możesz dodać wartość domyślną, aby wszelkie istniejące wstawki, które nie określają kolumny, nie zawiodły: ZMIEŃ TABELĘ FOO DODAJ OGRANICZENIE FOO_Bar_Default DOMYŚLNE 0 DLA Bar
Marc Gravell

4
Możesz być również zaskoczony, gdy wiesz, że w niektórych okolicznościach zmiana kolumny NOT NULLmoże spowodować wiele rejestrowania.
Martin Smith,

Odpowiedzi:


2011

Najpierw spraw, aby wszystkie bieżące NULLwartości zniknęły:

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

Następnie zaktualizuj definicję tabeli, aby nie dopuścić do „NULL”:

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

49
Pozwól mi dodać wartość do powyższych dwóch poprawnych odpowiedzi. Semantyka NULL może mieć kilka znaczeń. Jednym z powszechnych znaczeń jest NIEZNANY. Weź SCORE jako przykład. WYNIK zerowy i WYNIK ZEROWY to świat różnic! Zanim zrobiłeś powyższe zalecenia. Upewnij się, że aplikacja nie przyjmuje wartości NULL w logice biznesowej.
TechTravelThink

242
Wykonaj kopię zapasową bazy danych na wypadek, gdybyś popełnił literówkę, a twoja baza danych wybuchła.
mpen

20
To dziwne, że MS SQL Management Studio nie zezwala na tę opcję, chwali się „Dropping table ...”
Sebastian

14
Należy zawsze wykonać kopię zapasową baz danych. Nigdy nie wiadomo, kiedy jeden z twoich ludzi może napisać i zaktualizować lub usunąć instrukcję i zapomnieć o klauzuli WHERE.
Vivian River,

2
@SebastianGodelet: istnieje ustawienie, które pozwala wyłączyć to ostrzeżenie lub ustawić je tak, aby nie uniemożliwiało modyfikowania tabeli. W niektórych przypadkach zmiana schematu tabeli wymaga utworzenia nowej tabeli, skopiowania danych ze starej i starej tabeli. Ponieważ błąd w tym procesie może spowodować utratę danych, SSMS ostrzega cię i domyślnie uniemożliwia ci to.
siride

57

Miałem ten sam problem, ale pole było domyślnie ustawione na null, a teraz chcę ustawić domyślnie na 0. To wymagało dodania jeszcze jednej linii po rozwiązaniu mdb:

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

To nie rozwiązuje problemu. Wartość domyślna jest już ustawiona, to NIE NULL, którą należy zmienić. Tylko z Twoją odpowiedzią wszystkie istniejące rekordy pozostaną NULL, a problem pozostanie.
PandaWood,

6
Czy czytałeś część o „dodaniu jeszcze jednej linii”? Jak w, to jest dodatek do powyższej odpowiedzi?
Greg Dougherty

7
W rzeczywistości nie jest jasne, że „dodanie jeszcze jednego wiersza” oznacza „oprócz powyższej odpowiedzi” (zwłaszcza, że ​​istnieje wiele odpowiedzi „powyżej”) - jeśli o to ci chodziło, to brzmienie naprawdę musi się zmienić i powinieneś
dołącz

2
Chciałem tylko wejść do środka i powiedzieć, że dobrym pomysłem jest jawne nazwanie ograniczeń, w tym domyślnych. Jeśli kiedykolwiek będziesz musiał upuścić kolumnę, musisz znać nazwę ograniczenia do usunięcia, zanim będziesz mógł. Wpadłem na to podczas naszych migracji DB. Wiem, że przykład zawiera go tutaj, ale wciąż jest to miejsce, do którego niektórzy deweloperzy wpadają, ponieważ nazwa nie jest wymagana.
żartuje

38

Będziesz musiał to zrobić w dwóch krokach:

  1. Zaktualizuj tabelę, aby w kolumnie nie było null.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Zmień tabelę, aby zmienić właściwość kolumny
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

27

W przypadku Oracle 11g mogłem zmienić atrybut kolumny w następujący sposób:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

W przeciwnym razie odpowiedź abatichev wydawała się dobra. Nie można powtórzyć zmiany - narzeka (przynajmniej w SQL Developer), że kolumna nie jest już pusta.


Wygląda na to, że w Oracle 11 nie musisz powtarzać datatype. Samo columname NOT NULLwystarczy. Zobacz dokumentację .
jpmc26

18

to działało dla mnie:

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

16

Tak długo, jak kolumna nie jest unikalnym identyfikatorem

UPDATE table set columnName = 0 where columnName is null

Następnie

Zmień tabelę i ustaw w polu wartość inną niż null i określ wartość domyślną 0


4

wydaje się to prostsze, ale działa tylko na Oracle:

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

ponadto dzięki temu można również dodawać kolumny, a nie tylko je zmieniać. Aktualizuje się do wartości domyślnej (0) w tym przykładzie, jeśli wartość była null.


tak, ale Google kieruje tutaj ludźmi. Otrzymało wiele pozytywnych opinii i wiele negatywnych opinii. Myślę, że to przydatne. Każdy może to zignorować, ale szczerze myślę i widzę, że to pomaga ludziom.
csomakk

Proszę przeczytać zasady SO. Jak napisać dobrą odpowiedź? , ODPOWIEDZIALNIE NA PYTANIA TECHNICZNE i napisz idealne pytanie . Uwagi: Nie bój się usuwać (lub mocno edytować) bezużytecznych odpowiedzi i nie „odbieraj i uruchamiaj
Kiquenet,

4

W przypadku FOREIGN KEY CONSTRAINT... wystąpi problem, jeśli „0” nie będzie obecne w kolumnie tabeli kluczy podstawowych. Rozwiązaniem tego jest ...

KROK 1:

Wyłącz wszystkie ograniczenia za pomocą tego kodu:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

KROK 2:

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

KROK 3:

Włącz wszystkie ograniczenia za pomocą tego kodu:

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

4

W moim przypadku miałem problemy z wysłanymi odpowiedziami. Skończyło się na tym, że:

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

Zmień VARCHAR(200)typ danych i opcjonalnie zmień wartość domyślną.

Jeśli nie masz wartości domyślnej, będziesz mieć problem z dokonaniem tej zmiany, ponieważ domyślnie tworzenie konfliktu byłoby zerowe.


1

Weźmy przykład:

TABLE NAME=EMPLOYEE

I chcę zmienić kolumnę EMPLOYEE_NAMEna NOT NULL. Tego zapytania można użyć do zadania:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

Nie krzycz i używaj formatowania, aby post był bardziej czytelny. Np. Pomoc w rozpoznaniu części kodu. stackoverflow.com/editing-help
Yunnosch

Ponadto nie pisz dłuższego tekstu wielkimi literami. Uważa się, że krzyczy w Internecie
Zoe

1
@PawanTiwari proszę wprowadzić pełne zmiany. Wygląda na to, że nie naprawiłeś wszystkich problemów z postem. Większość z nich jest pisana wielkimi literami.
podwójny dźwięk

@ podwójny sygnał, na pewno będę o tym pamiętać. Dzięki
Pawan Tiwari

Oprócz problemów z formatowaniem wyjaśnij, jakie dodatkowe informacje daje twoja odpowiedź, w porównaniu np. Do starszych odpowiedzi Ralpha Wigguma, JDM, Rashmi Singha i trooper31, które na pierwszy rzut oka wydają się funkcjonalnie identyczne. Konieczne wydaje się zatem wskazanie drobniejszych punktów swojego rozwiązania. Staraj się unikać wrażenia, że ​​po prostu kopiujesz odpowiedzi ...
Yunnosch,

0

W przypadku wbudowanej javaDB zawartej w JDK (obsługiwana przez Oracle dystrybucja Apache Derby) poniższe działanie dla mnie działało

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

0

Aby kolumna nie była pusta i dodanie wartości domyślnej można również wykonać w graficznym interfejsie SSMS.

  1. Jak już powiedzieli inni, nie można ustawić „niepustego”, dopóki wszystkie istniejące dane nie będą „zerowe”:

UPDATE myTable SET myColumn = 0

  1. Gdy to zrobisz, z tabelą w widoku projektu (kliknij prawym przyciskiem myszy tabelę i kliknij „widok projektu”), możesz po prostu odznaczyć kolumny Zezwalaj na wartości zerowe w następujący sposób:

wprowadź opis zdjęcia tutaj

  1. W dalszym ciągu w widoku projektu z wybraną kolumną możesz zobaczyć Właściwości kolumny w oknie poniżej i ustawić tam wartość domyślną na 0, a także:

wprowadź opis zdjęcia tutaj


Widzę opinię, ale nie mogę nic poprawić bez informacji zwrotnej. Daj mi znać, jeśli coś nie działa.
Tony L.

-1

Możesz zmienić definicję istniejącej kolumny DB za pomocą następującego kodu SQL.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
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.