Bir sütunu değiştirme: null - not null


1217

Birkaç nullable tamsayı sütun içeren bir tablo var. Bu, çeşitli nedenlerle istenmeyen bir durumdur, bu yüzden tüm null'ları 0 olarak güncellemek ve sonra bu sütunları ayarlamak istiyorum NOT NULL. Null değerlerini değiştirmenin yanı sıra 0veriler korunmalıdır.

Ben " " için bir sütun (çağrı ) değiştirmek için belirli SQL sözdizimi arıyorum . Verilerin null içermeyecek şekilde güncellendiğini varsayın.ColumnAnot null

SQL Server 2000 kullanma .


16
Başka bir şey - sütunu belirtmeyen mevcut eklerin başarısız olmamasına bir varsayılan eklemek isteyebilirsiniz: ALTER TABLE FOO EKLE CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
Marc Gravell

4
Ayrıca, bazı koşullar altında bir sütunu değiştirmenin NOT NULLçok fazla günlük kaydına neden olabileceğini bilmek sizi şaşırtabilir .
Martin Smith

Yanıtlar:


2011

İlk olarak, tüm mevcut NULLdeğerleri ortadan kaldırın:

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

Ardından, tablo tanımını "NULLs" a izin vermeyecek şekilde güncelleyin:

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

49
Yukarıdaki iki doğru yanıta değer katarım. NULL anlambiliminin birkaç anlamı olabilir. Ortak anlamlardan biri BİLİNMİYOR. Örnek olarak SCORE'u ele alalım. Boş bir PUAN ve SIFIR BİR PUAN fark dünyasıdır! Yukarıdaki önerileri yapmadan önce. Uygulamanızın iş mantığında null almadığından emin olun.
TechTravelThink

242
Yazım hatası yaparsanız ve DB'niz patlarsa önce veritabanınızı yedekleyin.
Eylül'ü

20
Garip MS SQL Management Studio bu seçeneğe izin vermiyor, "Tablo bırakılıyor ..." hakkında övünüyor
Sebastian

14
Veritabanları her zaman yedeklenmelidir. İnsanlarınızdan birinin ne zaman yazı yazıp UPDATE veya DELETE yazıp WHERE yan tümcesini unutabileceğini asla bilemezsiniz.
Vivian River

2
@SebastianGodelet: Bu uyarıyı kapatmanıza veya tabloyu değiştirmenizi engellememesine izin veren bir ayar var. Bazı durumlarda, bir tablonun şemasını değiştirmek, yeni bir tablonun oluşturulmasını, eski ve eski tablonun üzerine kopyalanan verilerin düşmesini gerektirir. Bu işlemdeki bir hata veri kaybına neden olabileceğinden, SSMS sizi uyarır ve varsayılan olarak bunu yapmanızı engeller.
siride

57

Ben aynı sorunu vardı, ama alan null varsayılan olarak kullanılan ve şimdi 0 için varsayılan istiyorum. Bu mdb çözüm sonra bir satır daha eklemek gerekli:

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

Bu soruna cevap vermiyor. Varsayılan zaten ayarlanmıştır, değiştirilmesi gereken DEĞİL DEĞİLDİR. Sadece cevabınızla, mevcut tüm kayıtlar NULL olarak kalır ve sorun devam eder.
PandaWood

6
"Bir satır daha ekleme" bölümünü okudunuz mu? Bu, yukarıdaki cevaba ek olarak mı?
Greg Dougherty

7
Aslında, hayır, "bir satır daha eklemenin" yukarıdaki cevaba ek olarak "anlamına geldiği açık değildir (özellikle yukarıdaki" birçok cevap "olduğu için) - demek istediğiniz buysa, ifadenin gerçekten değişmesi gerekir ve atıfta bulunduğunuz cevap satırını
ekleyin

2
Sadece içeri girmek ve kısıtlamalarınızı, varsayılanlar dahil olmak üzere açıkça adlandırmanın iyi bir fikir olduğunu söylemek istedim. Bir sütunu bırakmanız gerekirse, yapabilmeniz için bırakılacak kısıtlamanın adını bilmeniz gerekir. Birkaç kez DB geçişlerimizde buna rastladık. Örnek burada içerir biliyorum, ama yine de bazı devs gezisi bir yer çünkü adı gerekli değildir.
jocull

38

Bunu iki adımda yapmanız gerekecek:

  1. Sütunda boş olmamak için tabloyu güncelleyin.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Sütunun özelliğini değiştirmek için tabloyu değiştirin
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

27

Oracle 11g için, sütun özelliğini aşağıdaki gibi değiştirebildim:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

Aksi halde abatichev'in cevabı iyi görünüyordu. Değişikliği tekrarlayamazsınız - sütunun zaten boş olmadığından şikayet eder (en azından SQL Developer'da).


Görünüşe göre Oracle 11'de tekrarlamak zorunda değilsiniz datatype. Sadece columname NOT NULLyeter. Belgelere bakın .
jpmc26

18

bu benim için çalıştı:

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

16

Sütun benzersiz bir tanımlayıcı olmadığı sürece

UPDATE table set columnName = 0 where columnName is null

Sonra

Tabloyu değiştirin ve alanı null olmayan olarak ayarlayın ve varsayılan 0 değerini belirleyin


4

bu daha basit görünüyor, ancak yalnızca Oracle üzerinde çalışıyor:

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

buna ek olarak, yalnızca değiştirmekle kalmaz, sütunlar da ekleyebilirsiniz. Değer null ise, bu örnekte varsayılan değer (0) ile güncellenir.


evet, ama google insanları buraya yönlendiriyor .. Neden birçok upvotes ve neden downwotes aldı. Bunun yararlı olduğunu düşünüyorum. Herkes bunu görmezden gelmekte özgürdür, ama dürüstçe bunun insanlara yardım ettiğini düşünüyorum ve görüyorum.
csomakk


4

FOREIGN KEY CONSTRAINT... durumunda, Birincil anahtar tablosu sütununda '0' yoksa bir sorun olacaktır. Bunun çözümü ...

AŞAMA 1:

Bu kodu kullanarak tüm kısıtlamaları devre dışı bırakın:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

ADIM 2:

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

AŞAMA 3:

Bu kodu kullanarak tüm kısıtlamaları etkinleştirin:

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

4

Benim durumumda gönderilen cevaplarla ilgili zorluklar yaşadım. Aşağıdaki kullanarak sona erdi:

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

Değişim VARCHAR(200)için veri türüne ve isteğe bağlı olarak varsayılan değeri değiştirin.

Varsayılan bir değeriniz yoksa, bu değişikliği yaparken bir sorunla karşılaşırsınız, çünkü varsayılan olarak bir çakışma yaratır.


1

Bir örnek verelim:

TABLE NAME=EMPLOYEE

Ve sütunu EMPLOYEE_NAMEolarak değiştirmek istiyorum NOT NULL. Bu sorgu görev için kullanılabilir:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

Yazılarınızı daha okunabilir hale getirmek için lütfen bağırmayın ve biçimlendirmeyi kullanmayın. Örneğin kod parçasının tanınmasına yardımcı olun. stackoverflow.com/editing-help
Yunnosch

Ayrıca, lütfen tamamen büyük harflerle yazmayın. İnternette bağırmak kabul edilir
Zoe

1
@PawanTiwari lütfen tam düzenlemeleri yapın. Gönderinin tüm sorunlarını düzeltmediniz. Çoğu büyük harfle yazılır.
çift ​​bip

@ çift bip, eminim bunu aklımda tutacağım. Teşekkürler
Pawan Tiwari

Biçimlendirme sorunlarının yanı sıra, örneğin ilk bakışta işlevsel olarak aynı görünen Ralph Wiggum, JDM, Rashmi Singh ve trooper31'in eski cevaplarına kıyasla, cevabınızın sağladığı ek içgörüleri daha açık hale getirin. Bu nedenle çözümünüzün daha ince noktalarını belirtmek gerekli görünüyor. Sadece cevapları kopyalama izleniminden kaçınmaya çalışın ...
Yunnosch

0

JDK'da (Oracle'ın Apache Derby'nin desteklenen dağıtımı) bulunan dahili javaDB için aşağıdakiler benim için çalıştı

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

0

SSMS GUI'sinde sütunu boş bırakmamak ve varsayılanı eklemek de yapılabilir.

  1. Diğerlerinin de belirttiği gibi, mevcut tüm veriler "null değil" olana kadar "null değil" ayarlayamazsınız:

UPDATE myTable SET myColumn = 0

  1. İşlem tamamlandığında, tablo tasarım görünümündeyken (tabloya sağ tıklayın ve "tasarım görünümü" tıklayın ), Yalnızca Boş Değerlere İzin Ver sütunlarının işaretini kaldırabilirsiniz :

resim açıklamasını buraya girin

  1. Sütun seçiliyken hala tasarım görünümünde, aşağıdaki pencerede Sütun Özellikleri'ni görebilir ve varsayılanı orada da 0 olarak ayarlayabilirsiniz:

resim açıklamasını buraya girin


Aşağı oyu görüyorum ama geri bildirim olmadan hiçbir şeyi düzeltemiyorum. Bir şey işe yaramadıysa lütfen bana bildirin.
Tony L.

-1

Aşağıdaki sql kullanarak varolan DB sütun tanımını değiştirebilirsiniz.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.