Mengubah kolom: nol menjadi tidak nol

1217

Saya memiliki tabel yang memiliki beberapa kolom integer yang dapat dibatalkan. Ini tidak diinginkan karena beberapa alasan, jadi saya mencari untuk memperbarui semua nol ke 0 dan kemudian mengatur kolom ini menjadi NOT NULL. Selain mengubah nulls menjadi 0, data harus dilestarikan.

Saya mencari sintaks SQL spesifik untuk mengubah kolom (sebut saja ColumnA) menjadi " not null". Asumsikan data telah diperbarui agar tidak mengandung nol.

Menggunakan SQL server 2000 .

Karmic Coder
sumber
16
Satu hal lagi - Anda mungkin ingin menambahkan default untuk bahwa setiap sisipan yang ada yang tidak menentukan kolom jangan gagal: ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
Marc Gravell
4
Anda juga mungkin terkejut mengetahui bahwa dalam beberapa keadaan mengubah kolom NOT NULLdapat menyebabkan banyak penebangan.
Martin Smith

Jawaban:

2012

Pertama, buat semua NULLnilai saat ini hilang:

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

Kemudian, perbarui definisi tabel untuk melarang "NULLs":

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
mdb
sumber
49
Biarkan saya memberi nilai tambah pada dua respons di atas yang benar. Semantik NULL dapat memiliki beberapa makna. Salah satu makna yang umum adalah TIDAK DIKENAL. Ambil SCORE sebagai contoh. NILAI SCORE dan NOL SCORE adalah dunia yang berbeda! Sebelum Anda melakukan rekomendasi di atas. Pastikan aplikasi Anda tidak memiliki null dalam logika bisnisnya.
TechTravelThink
242
Cadangkan dulu basis data Anda jika Anda salah ketik dan DB meledak.
mpen
20
Anehnya MS SQL Management Studio tidak mengizinkan opsi itu, ia membual tentang "Dropping table ..."
Sebastian
14
Database harus selalu didukung. Anda tidak pernah tahu kapan salah satu orang Anda mungkin menulis dan memperbarui atau HAPUS pernyataan dan melupakan klausa WHERE.
Sungai Vivian
2
@SebastianGodelet: ada pengaturan yang memungkinkan Anda untuk mematikan peringatan itu, atau membuatnya sehingga tidak mencegah Anda dari memodifikasi tabel. Dalam beberapa kasus, mengubah skema tabel mengharuskan meja baru dibuat, data disalin dari yang lama dan tabel lama dihapus. Karena kesalahan dalam proses ini dapat menyebabkan hilangnya data, SSMS memperingatkan Anda dan, secara default, mencegah Anda melakukannya.
siride
57

Saya memiliki masalah yang sama, tetapi bidang yang digunakan untuk default ke nol, dan sekarang saya ingin default ke 0. Yang diperlukan menambahkan satu baris lagi setelah solusi mdb:

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];
Greg Dougherty
sumber
Ini tidak menjawab masalah. Standarnya sudah diatur, itu BUKAN NULL yang perlu diubah. Dengan hanya jawaban Anda, semua catatan yang ada akan tetap NULL dan masalahnya tetap ada.
PandaWood
6
Apakah Anda membaca bagian tentang "menambahkan satu baris lagi"? Seperti dalam, ini selain jawaban di atas?
Greg Dougherty
7
Sebenarnya, tidak tidak jelas bahwa "menambahkan satu baris lagi" berarti "selain jawaban di atas" (terutama karena ada banyak jawaban "di atas") - jika itu yang Anda maksudkan, maka kata-katanya benar-benar perlu diubah dan Anda harus termasuk baris jawaban yang Anda rujuk
PandaWood
2
Hanya ingin berpadu dan mengatakan bahwa itu adalah ide yang baik untuk secara eksplisit menyebutkan kendala Anda, termasuk bawaannya. Jika Anda perlu untuk menjatuhkan kolom, Anda harus tahu nama batasan untuk dijatuhkan sebelum Anda bisa. Lihat ini di migrasi DB kami beberapa kali. Saya tahu contohnya termasuk di sini, tetapi masih merupakan tempat beberapa devs perjalanan karena nama tidak diperlukan.
jocull
38

Anda harus melakukannya dalam dua langkah:

  1. Perbarui tabel sehingga tidak ada null di kolom.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Ubah tabel untuk mengubah properti kolom
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL
Ralph Wiggum
sumber
27

Untuk Oracle 11g, saya dapat mengubah atribut kolom sebagai berikut:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

Kalau tidak, jawaban Abatichev tampak bagus. Anda tidak dapat mengulangi perubahan - itu mengeluh (setidaknya di SQL Developer) bahwa kolom tersebut sudah tidak nol.

JDM
sumber
Tampaknya di Oracle 11, Anda tidak perlu mengulangi datatype. Cukup columname NOT NULLsudah. Lihat dokumentasi .
jpmc26
18

ini bekerja untuk saya:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;
Dheeraj Sam
sumber
16

Selama kolom bukan pengidentifikasi unik

UPDATE table set columnName = 0 where columnName is null

Kemudian

Ubah tabel dan atur bidang ke non null dan tentukan nilai default 0

Eppz
sumber
4

ini tampaknya lebih sederhana, tetapi hanya berfungsi pada Oracle:

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

selain itu, dengan ini, Anda juga dapat menambahkan kolom, bukan hanya mengubahnya. Ini memperbarui ke nilai default (0) dalam contoh ini, jika nilainya nol.

csomakk
sumber
ya, tapi google mengarahkan orang di sini .. Ini menerima banyak upvotes yang menyebabkannya, dan banyak downwotes. Saya pikir ini berguna. Semua orang bebas untuk mengabaikan ini, tetapi saya jujur ​​berpikir dan melihat ini membantu orang.
csomakk
Tolong, baca aturan SO. Bagaimana saya menulis jawaban yang bagus? , JAWABAN PERTANYAAN TEKNIS MEMBANTU dan Tulis pertanyaan yang sempurna . Catatan: Jangan takut untuk menghapus (atau mengedit jawaban) yang tidak berguna dan Jangan “jawab dan jalankan
Kiquenet
4

Dalam hal FOREIGN KEY CONSTRAINT... akan ada masalah jika '0' tidak ada di kolom tabel kunci utama. Solusi untuk itu adalah ...

LANGKAH 1:

Nonaktifkan semua kendala menggunakan kode ini:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

LANGKAH 2:

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

LANGKAH3:

Aktifkan semua kendala menggunakan kode ini:

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

Dalam kasus saya, saya mengalami kesulitan dengan jawaban yang diposting. Saya akhirnya menggunakan yang berikut ini:

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

Ubah VARCHAR(200)ke tipe data Anda, dan secara opsional ubah nilai default.

Jika Anda tidak memiliki nilai default, Anda akan mengalami masalah dalam membuat perubahan ini, karena defaultnya adalah nol yang menciptakan konflik.

Philip Kirkbride
sumber
1

Mari kita ambil contoh:

TABLE NAME=EMPLOYEE

Dan saya ingin mengubah kolom EMPLOYEE_NAMEmenjadi NOT NULL. Kueri ini dapat digunakan untuk tugas:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;
Ashish Dwivedi
sumber
Tolong jangan berteriak dan gunakan format sebagai gantinya untuk membuat posting Anda lebih mudah dibaca. Misalnya membantu mengenali bagian kode. stackoverflow.com/editing-help
Yunnosch
Juga, tolong jangan menulis teks yang lebih panjang dalam huruf kapital semua. Dianggap berteriak di internet
Zoe
1
@PawanTiwari silakan edit penuh. Tampaknya Anda tidak memperbaiki semua masalah pada pos. Sebagian besar dikapitalisasi.
bunyi bip ganda
@ double-beep, Tentu saya akan mengingatnya. Terima kasih
Pawan Tiwari
Terlepas dari masalah pemformatan, mohon buat lebih jelas apa wawasan tambahan yang diberikan jawaban Anda, dibandingkan misalnya dengan jawaban yang lebih lama oleh Ralph Wiggum, JDM, Rashmi Singh dan trooper31, yang tampak identik secara fungsional pada pandangan pertama. Tampaknya perlu untuk menunjukkan poin-poin penting dari solusi Anda. Cobalah untuk menghindari kesan hanya menyalin jawaban ...
Yunnosch
0

Untuk javaDB inbuilt termasuk dalam JDK (distribusi yang didukung Oracle dari Apache Derby) di bawah ini bekerja untuk saya

alter table [table name] alter column [column name] not null;
polisi31
sumber
0

Membuat kolom bukan nol dan menambahkan default juga bisa dilakukan di GUI SSMS.

  1. Seperti yang telah dinyatakan orang lain, Anda tidak dapat menetapkan "tidak nol" sampai semua data yang ada "tidak nol" seperti:

UPDATE myTable SET myColumn = 0

  1. Setelah selesai, dengan tabel dalam tampilan desain (klik kanan pada tabel dan klik "tampilan desain"), Anda dapat menghapus centang pada kolom Allow Nulls seperti:

masukkan deskripsi gambar di sini

  1. Masih dalam tampilan desain dengan kolom yang dipilih, Anda dapat melihat Properti Kolom di jendela di bawah ini dan mengatur default ke 0 di sana juga seperti:

masukkan deskripsi gambar di sini

Tony L.
sumber
Saya melihat downvote tetapi saya tidak bisa memperbaiki apa pun tanpa umpan balik. Tolong beri tahu saya jika ada sesuatu yang tidak berhasil.
Tony L.
-1

Anda dapat mengubah definisi kolom DB yang ada menggunakan sql berikut.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
Rashmi singh
sumber