Thay đổi một cột: null thành không null


1217

Tôi có một bảng có nhiều cột số nguyên nullable. Điều này là không mong muốn vì nhiều lý do, vì vậy tôi đang tìm cách cập nhật tất cả null thành 0 và sau đó đặt các cột này thành NOT NULL. Ngoài việc thay đổi null thành 0, dữ liệu phải được bảo tồn.

Tôi đang tìm kiếm cú pháp SQL cụ thể để thay đổi một cột (gọi nó ColumnA) thành " not null". Giả sử dữ liệu đã được cập nhật để không chứa null.

Sử dụng máy chủ SQL 2000 .


16
Một điều khác - bạn có thể muốn thêm một mặc định cho bất kỳ chèn nào hiện tại không chỉ định cột không thất bại: ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
Marc Gravell

4
Ngoài ra, bạn có thể ngạc nhiên khi biết rằng trong một số trường hợp, việc thay đổi một cột NOT NULLcó thể gây ra nhiều đăng nhập.
Martin Smith

Câu trả lời:


2012

Đầu tiên, làm cho tất cả các NULLgiá trị hiện tại biến mất:

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

Sau đó, cập nhật định nghĩa bảng để không cho phép "NULL":

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

49
Hãy để tôi thêm giá trị vào hai câu trả lời đúng ở trên. Các ngữ nghĩa của NULL có thể có một vài ý nghĩa. Một trong những ý nghĩa phổ biến là UNKNOWN. Lấy SCORE làm ví dụ. SCORE null và ZERO SCORE là một thế giới khác biệt! Trước khi bạn thực hiện các khuyến nghị trên. Hãy chắc chắn rằng ứng dụng của bạn không mất giá trị trong logic kinh doanh của nó.
TechTravelThink

242
Sao lưu cơ sở dữ liệu của bạn trước trong trường hợp bạn mắc lỗi đánh máy và DB của bạn phát nổ.
mở

20
Thật kỳ lạ, MS SQL Management Studio không cho phép tùy chọn đó, nó khoe khoang về "Bàn rớt ..."
Sebastian

14
Cơ sở dữ liệu phải luôn được sao lưu. Bạn không bao giờ biết khi nào một trong những người của bạn có thể viết và CẬP NHẬT hoặc XÓA câu lệnh và quên mệnh đề WHERE.
Sông Vivian

2
@SebastianGodelet: có một cài đặt cho phép bạn tắt cảnh báo đó hoặc thực hiện để nó không ngăn bạn sửa đổi bảng. Trong một số trường hợp, việc thay đổi lược đồ của bảng yêu cầu tạo một bảng mới, dữ liệu được sao chép từ bảng cũ và bảng cũ bị hủy. Vì một lỗi trong quá trình này có thể dẫn đến mất dữ liệu, SSMS cảnh báo bạn và theo mặc định, ngăn bạn thực hiện việc đó.
siride 15/03/2015

57

Tôi có cùng một vấn đề, nhưng trường được sử dụng để mặc định là null và bây giờ tôi muốn mặc định nó thành 0. Điều đó yêu cầu thêm một dòng nữa sau giải pháp của mdb:

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

Điều này không trả lời vấn đề. Mặc định đã được đặt, đó là KHÔNG PHẢI cần thay đổi. Chỉ với câu trả lời của bạn, tất cả các hồ sơ hiện có sẽ ở lại NULL và vấn đề vẫn còn.
PandaWood

6
Bạn đã đọc phần "thêm một dòng" chưa? Như trong, đây là ngoài câu trả lời trên?
Greg Dougherty

7
Trên thực tế, không có gì rõ ràng rằng "thêm một dòng nữa" có nghĩa là "ngoài câu trả lời ở trên" (đặc biệt là có nhiều câu trả lời "ở trên") - nếu đó là ý bạn, thì từ ngữ thực sự cần thay đổi và bạn nên thay đổi bao gồm dòng câu trả lời bạn đề cập đến
PandaWood

2
Chỉ muốn kêu gọi và nói rằng đó là một ý tưởng tốt để đặt tên rõ ràng cho các ràng buộc của bạn, bao gồm các mặc định. Nếu bạn cần bỏ một cột, bạn sẽ phải biết tên của ràng buộc để bỏ trước khi bạn có thể. Chạy vào đây trong việc di chuyển DB của chúng tôi một vài lần. Tôi biết ví dụ bao gồm nó ở đây, nhưng nó vẫn là nơi một số nhà phát triển đi lên vì tên này không bắt buộc.
vui vẻ

38

Bạn sẽ phải làm điều đó theo hai bước:

  1. Cập nhật bảng để không có null trong cột.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Thay đổi bảng để thay đổi thuộc tính của cột
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

27

Đối với Oracle 11g, tôi đã có thể thay đổi thuộc tính cột như sau:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

Nếu không, câu trả lời của abatichev có vẻ tốt. Bạn không thể lặp lại thay đổi - điều này phàn nàn (ít nhất là trong Nhà phát triển SQL) rằng cột đã không rỗng.


Có vẻ như trong Oracle 11, bạn không phải lặp lại datatype. Chỉ columname NOT NULLlà đủ. Xem tài liệu .
jpmc26

18

điều này làm việc cho tôi:

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

16

Miễn là cột không phải là định danh duy nhất

UPDATE table set columnName = 0 where columnName is null

Sau đó

Thay đổi bảng và đặt trường thành không null và chỉ định giá trị mặc định là 0


4

điều này có vẻ đơn giản hơn, nhưng chỉ hoạt động trên Oracle:

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

Ngoài ra, với điều này, bạn cũng có thể thêm các cột, không chỉ thay đổi nó. Nó cập nhật giá trị mặc định (0) trong ví dụ này, nếu giá trị là null.


vâng, nhưng google chỉ dẫn mọi người ở đây .. Nó nhận được rất nhiều upvote gây ra nó, và rất nhiều downwote. Tôi nghĩ rằng nó hữu ích. Mọi người có thể tự do bỏ qua điều này, nhưng tôi thành thật nghĩ và thấy điều này đang giúp đỡ mọi người.
csomakk 17/8/2016

Xin vui lòng, đọc quy tắc SO. Làm thế nào để tôi viết một câu trả lời tốt? , Giải đáp thắc mắc KỸ THUẬT helpfullyViết câu hỏi hoàn hảo . Ghi chú: Đừng ngại xóa (hoặc chỉnh sửa nhiều) các câu trả lời vô dụngĐừng trả lời và chạy
Kiquenet

4

Trong trường hợp FOREIGN KEY CONSTRAINT... sẽ có vấn đề nếu '0' không xuất hiện trong cột của bảng khóa chính. Giải pháp cho điều đó là ...

BƯỚC 1:

Vô hiệu hóa tất cả các ràng buộc sử dụng mã này:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

BƯỚC 2:

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

BƯỚC 3:

Cho phép tất cả các ràng buộc sử dụng mã này:

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

4

Trong trường hợp của tôi, tôi đã gặp khó khăn với các câu trả lời được đăng. Tôi đã kết thúc bằng cách sử dụng như sau:

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

Thay đổi VARCHAR(200)kiểu dữ liệu của bạn và tùy ý thay đổi giá trị mặc định.

Nếu bạn không có giá trị mặc định, bạn sẽ gặp vấn đề khi thực hiện thay đổi này, vì mặc định sẽ không tạo ra xung đột.


1

Hãy lấy một ví dụ:

TABLE NAME=EMPLOYEE

Và tôi muốn thay đổi cột EMPLOYEE_NAMEthành NOT NULL. Truy vấn này có thể được sử dụng cho nhiệm vụ:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

Xin vui lòng không la hét và sử dụng định dạng thay vào đó để làm cho bạn đăng dễ đọc hơn. Ví dụ như giúp nhận ra phần mã. stackoverflow.com/editing-help
Yunnosch

Ngoài ra, vui lòng không viết văn bản dài hơn trong tất cả các chữ hoa. Nó được coi là la hét trên internet
Zoe

1
@PawanTiwari vui lòng chỉnh sửa đầy đủ. Bạn dường như không khắc phục tất cả các vấn đề của bài viết. Hầu hết được viết hoa.
tiếng bíp đôi

@ đôi tiếng bíp, Chắc chắn tôi sẽ ghi nhớ điều đó. Cảm ơn
Pawan Tiwari

Ngoài các vấn đề định dạng, vui lòng làm rõ hơn những gì mà câu trả lời của bạn cung cấp, so với các câu trả lời cũ của Ralph Wiggum, JDM, Rashmi Singh và trooper31, có vẻ giống nhau về mặt chức năng ngay từ cái nhìn đầu tiên. Dường như cần thiết phải chỉ ra những điểm tốt hơn trong giải pháp của bạn. Cố gắng tránh ấn tượng chỉ cần sao chép câu trả lời ...
Yunnosch

0

Đối với javaDB đã được tích hợp sẵn trong JDK (bản phân phối được hỗ trợ của Oracle về Apache Derby), phần dưới đây hoạt động với tôi

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

0

Làm cho cột không rỗng và thêm mặc định cũng có thể được thực hiện trong GUI SSMS.

  1. Như những người khác đã nêu, bạn không thể đặt "không null" cho đến khi tất cả dữ liệu hiện tại là "không null" như vậy:

UPDATE myTable SET myColumn = 0

  1. Khi đã xong, với bảng trong dạng xem thiết kế (nhấp chuột phải vào bảng và nhấp vào "dạng xem thiết kế"), bạn chỉ có thể bỏ chọn các cột Cho phép Nulls như vậy:

nhập mô tả hình ảnh ở đây

  1. Vẫn trong chế độ xem thiết kế với cột được chọn, bạn có thể thấy Thuộc tính Cột trong cửa sổ bên dưới và đặt mặc định thành 0 trong đó cũng như vậy:

nhập mô tả hình ảnh ở đây


Tôi thấy downvote nhưng tôi không thể sửa bất cứ điều gì mà không có phản hồi. Xin vui lòng cho tôi biết nếu một cái gì đó không làm việc.
Tony L.

-1

Bạn có thể thay đổi định nghĩa của cột DB hiện tại bằng cách sử dụng sql sau.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.