2013-08-23 77 views
14

Tôi có bảng có cột chứa một vài giá trị rỗng. Tôi muốn thêm một ràng buộc NOT NULL trên cột đó mà không cập nhật các giá trị rỗng hiện có thành giá trị không null. Tôi muốn giữ các giá trị null hiện có và kiểm tra các hàng trong tương lai mà chúng chứa một giá trị không null cho cột này. Điều này có thể không? Làm sao?Cách thêm ràng buộc không null vào cột chứa giá trị rỗng

+4

Có vẻ một chút điên hiện vi phạm hạn chế của riêng bạn. Hoặc là hoặc không được phép là rỗng. Thông thường, loại đó, um, tính linh hoạt được đặt trong ứng dụng sẽ cung cấp cho cơ sở dữ liệu của bạn chứ không phải trong cơ sở dữ liệu. Làm những gì bạn muốn làm, theo cách đó nằm điên rồ. :) – railsdog

+0

Bạn có thể có trình kích hoạt chèn/cập nhật để từ chối bất kỳ giá trị rỗng mới nào. Nhưng nhìn chung, điều này nghe như một ý tưởng tồi. – Thilo

+0

Không điên chút nào. Tôi đã sử dụng điều này nhân dịp trong các hệ thống mà họ muốn giữ dữ liệu cũ (cũ), nhưng bắt đầu kiểm tra một ràng buộc cho bất kỳ dữ liệu mới (hoặc cập nhật). –

Trả lời

35

Bạn có thể thêm một ràng buộc không được xác định - nó sẽ không xem xét các hàng hiện có, nhưng nó sẽ được kiểm tra cho bất kỳ hàng mới hoặc hàng cập nhật nào.

ALTER TABLE mytable MODIFY mycolumn NOT NULL NOVALIDATE; 

Chỉ cần lưu ý rằng bạn sẽ không thể cập nhật hàng hiện tại trừ khi nó thỏa mãn ràng buộc.

Ngoài ra, hãy nhận thức được nhược điểm mà trình tối ưu hóa sẽ không thể tận dụng hạn chế này trong việc lập kế hoạch của nó - nó phải giả định rằng một số hàng vẫn có thể có giá trị rỗng.

+0

Bạn có thể vui lòng cung cấp một số liên kết bên ngoài để tham khảo thêm không? Cảm ơn! – Rachcha

+1

Cụ thể bạn là ai sau? Tài liệu: http://docs.oracle.com/cd/E11882_01/server.112/e41084/clauses002.htm#i1002273 –

-1

ALTER TABLE table_name SET column_name = '0' WHERE column_name IS NULL;

ALTER TABLE table_name MODIFY COLUMN (column_name NUMBER CONSTRAINT constraint_identifier NOT NULL);

Đây là khóa học giả định rằng cột của bạn là một số nhưng thực sự là điều tương tự, bạn chỉ cần thay đổi '0' thành giá trị mặc định không phải là rỗng.

0

Hammad: Tôi đối mặt với những vấn đề và giải quyết như sau:

Alter bảng thr_empl_info sửa đổi THR_EM_DESIGNATION_ID không null