2010-03-29 23 views
62

Tôi có một cơ sở dữ liệu có ràng buộc NOT NULL trên một trường, và tôi muốn loại bỏ ràng buộc này. Yếu tố phức tạp là ràng buộc này có tên được hệ thống xác định và tên của ràng buộc này khác nhau giữa máy chủ sản xuất, máy chủ tích hợp và các cơ sở dữ liệu nhà phát triển khác nhau. Quy trình hiện tại của chúng tôi là kiểm tra các kịch bản lệnh thay đổi và một nhiệm vụ tự động thực hiện các truy vấn thích hợp thông qua sqlplus so với cơ sở dữ liệu đích, vì vậy tôi muốn một giải pháp có thể được gửi thẳng vào sqlplus.Làm thế nào tôi có thể thả một ràng buộc "không null" trong Oracle khi tôi không biết tên của ràng buộc?

Mở cơ sở dữ liệu của riêng tôi, SQL để thả này sẽ là:

alter table MYTABLE drop constraint SYS_C0044566 

tôi có thể thấy khó khăn khi tôi truy vấn all_constraints xem:

select * from all_constraints where table_name = 'MYTABLE' 

nhưng tôi không chắc chắn làm thế nào để làm việc với loại dữ liệu LONG của SEARCH_CONDITION hoặc cách tốt nhất để tự động xóa ràng buộc tra cứu ngay cả sau khi tôi biết tên của nó.

Vì vậy, làm cách nào để tạo tập lệnh thay đổi có thể làm giảm ràng buộc này dựa trên đó là gì, thay vì tên của nó là gì?


EDIT: @ câu trả lời Allan là một tốt nhất, nhưng tôi quan tâm (trong tôi thiếu Oracle chuyên môn) mà nó có thể không phổ biến sự thật rằng bất kỳ khó khăn nào có thể có một cái tên hệ thống được tạo ra sẽ có liên kết với nó một cách để loại bỏ các ràng buộc mà không cần phải biết tên của nó. Có đúng là sẽ luôn có cách để tránh phải biết tên của một hạn chế của hệ thống khi giảm một cách hợp lý ràng buộc đó?

+3

Chỉ để thỏa mãn sự tò mò của bạn: Ràng buộc NOT NULL là loại hạn chế * duy nhất * trong Oracle mà bạn có thể loại bỏ mà không cần biết tên của ràng buộc. Tất cả các loại ràng buộc khác mà bạn cần phải biết tên của ràng buộc. –

Trả lời

132
alter table MYTABLE modify (MYCOLUMN null); 

Trong Oracle, không ràng buộc rỗng được tạo tự động khi không được chỉ định cho cột. Tương tự như vậy, chúng được tự động giảm khi cột được thay đổi để cho phép null.

Làm rõ câu hỏi đã sửa đổi: Giải pháp này chỉ áp dụng cho các ràng buộc được tạo cho cột "không trống". Nếu bạn chỉ định "Primary Key" hoặc một ràng buộc kiểm tra trong định nghĩa cột mà không đặt tên nó, bạn sẽ kết thúc với một tên do hệ thống tạo ra cho ràng buộc (và chỉ mục, cho khóa chính). Trong những trường hợp đó, bạn cần phải biết tên để thả nó. Lời khuyên tốt nhất là tránh kịch bản bằng cách đảm bảo bạn chỉ định tên cho tất cả các ràng buộc khác với "không phải là null". Nếu bạn thấy mình trong tình huống mà bạn cần phải loại bỏ một trong những ràng buộc này một cách tổng quát, bạn có thể cần phải sử dụng PL/SQL và các bảng định nghĩa dữ liệu.

+0

Điều đó dường như thực sự quá tốt là đúng, nhưng nó chắc chắn xử lý trường hợp hiện tại của tôi và đơn giản là hoàn toàn đơn giản! Có bất kỳ trường hợp nào trong oracle nơi tên ràng buộc có thể được tạo ra bởi hệ thống nhưng sql không thể được viết để tránh tên ràng buộc như thế không? –

+1

Cảm ơn ... nó chỉ ra rằng các ràng buộc 'không null' là những cái duy nhất có tên hệ thống trong lược đồ của tôi có khả năng ảnh hưởng đến tôi theo cách này. –

14

Hãy thử:

alter table <your table> modify <column name> null; 
+0

Nó hoạt động. Cảm ơn –

1

Chỉ cần nhớ, nếu trường bạn muốn chắc nullable là một phần của khóa chính, bạn không thể. Các khóa chính không thể có các trường rỗng.

0

Tôi đang đối mặt với cùng một vấn đề khi cố gắng tránh xung quanh một ràng buộc kiểm tra tùy chỉnh mà tôi cần phải cập nhật để cho phép các giá trị khác nhau. Vấn đề là ALL_CONSTRAINTS không có cách nào để cho biết cột nào ràng buộc (s) được áp dụng cho. Cách tôi quản lý để làm điều đó là bằng cách truy vấn ALL_CONS_COLUMNS thay vào đó, sau đó thả từng ràng buộc theo tên của họ và tạo lại nó.

chọn constraint_name từ all_cons_columns nơi tên_bảng = [TABLE_NAME] và tên_cột = [COLUMN_NAME mới];

1

Để khám phá bất kỳ hạn chế sử dụng, sử dụng mã dưới đây:

-- Set the long data type for display purposes to 500000. 

SET LONG 500000 

-- Define a session scope variable. 

VARIABLE output CLOB 

-- Query the table definition through the <code>DBMS_METADATA</code> package. 

SELECT dbms_metadata.get_ddl('TABLE','[Table Described]') INTO :output FROM dual; 

này về cơ bản cho thấy một tuyên bố tạo cho cách bảng tham chiếu được thực hiện. Bằng cách biết cách tạo bảng, bạn có thể thấy tất cả các ràng buộc của bảng.

Trả lời được lấy từ blog của Michael McLaughlin: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ Từ lớp Thiết kế cơ sở dữ liệu của tôi.

Các vấn đề liên quan