Chúng tôi có một tình huống kỳ lạ trên một bảng trong một cơ sở dữ liệu Oracle, nơi thả một kết quả cột trong việc thay đổi các giá trị mặc định của cột khác. Đây là kịch bản.Tại sao Oracle DROP COLUMN này thay đổi giá trị mặc định của một cột khác?
Tôi có bàn của tôi với một số dữ liệu mẫu trong đó:
select * from SAMPLE_TABLE ;
ID BUSINESS_KEY
---------------------------------------- ---------------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb 1
c0dabf78-d9ca-4072-832e-aeb618c7ed14 2
tôi thêm cột type1 với một hạn chế kiểm tra (TYPE1_VAL1 hoặc TYPE1_VAL2) và một giá trị mặc định TYPE1_VAL2:
alter table SAMPLE_TABLE add TYPE1 varchar(10) default 'TYPE1_VAL2' not null check(TYPE1 in ('TYPE1_VAL1', 'TYPE1_VAL2'));
Table altered.
Tôi thấy rằng giá trị mặc định (TYPE1_VAL2) được lấp đầy một cách chính xác trong:
select * from SAMPLE_TABLE ;
ID BUSINESS_KEY TYPE1
---------------------------------------- --------------- ----------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb 1 TYPE1_VAL2
c0dabf78-d9ca-4072-832e-aeb618c7ed14 2 TYPE1_VAL2
tôi thêm một cột type2 với một hạn chế kiểm tra (TYPE2_VAL1 hoặc TYPE2_VAL2) và một giá trị mặc định TYPE2_VAL2:
alter table SAMPLE_TABLE add TYPE2 varchar(15) default 'TYPE2_VAL2' not null check(TYPE2 in ('TYPE2_VAL1', 'TYPE2_VAL2'));
Table altered.
Và một lần nữa thấy rằng giá trị mặc định (TYPE2_VAL2) là chính xác:
SYSTEM(SYSTEM) @ DB_USER > select * from SAMPLE_TABLE ;
ID BUSINESS_KEY TYPE1 TYPE2
---------------------------------------- --------------- ---------- ---------------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb 1 TYPE1_VAL2 TYPE2_VAL2
c0dabf78-d9ca-4072-832e-aeb618c7ed14 2 TYPE1_VAL2 TYPE2_VAL2
Và bây giờ là phần lạ. Khi tôi thả cột đầu tiên, có vẻ như để áp dụng các giá trị mặc định từ cột thả vào các cột còn lại:
ALTER TABLE SAMPLE_TABLE DROP COLUMN TYPE1;
Table altered.
select * from SAMPLE_TABLE ;
ID BUSINESS_KEY TYPE2
---------------------------------------- --------------- ---------------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb 1 TYPE1_VAL2
c0dabf78-d9ca-4072-832e-aeb618c7ed14 2 TYPE1_VAL2
Vì vậy, nơi trước type2 cột chứa TYPE2_VAL2, tất cả của một đột ngột sau khi thả nó chứa TYPE1_VAL2. Nó giống như ràng buộc kiểm tra của cột bị loại bỏ được di chuyển đến cột này.
Điều này xảy ra trên môi trường thử nghiệm của chúng tôi nơi chúng tôi đang chạy Cơ sở dữ liệu Oracle 11g Bản phát hành 11.2.0.4.0 - Sản xuất 64 bit trên Linux.
Trên phiên bản CentOS/Oracle XE địa phương của chúng tôi, chúng tôi không có vấn đề này.
Bất kỳ ý tưởng nào có thể gây ra điều này và cách chúng tôi có thể ngăn điều này xảy ra. Đây có phải là do thiết kế/lỗi/lỗi của chúng tôi không?
Mùi như bạn cần mở SR. –
Điều này làm việc cho tôi trên 11.2.0.4 trên Solaris. Trông giống như một lỗi rất cụ thể. Giống như Luc M nói, có thể bạn sẽ cần phải mở một SR. (Ngoài ra, tôi không chắc tại sao một người nào đó đã bỏ phiếu để đóng câu hỏi này - đây là câu hỏi hoàn toàn hợp lệ cho trang web này.) –
Có thể là một điều gì đó liên quan đến thực tế là các giá trị mặc định hiện được lưu trữ dưới dạng siêu dữ liệu (mặc dù điều đó không được nêu rõ ràng trong [tài liệu] (http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/tables006.htm#sthref1856), tôi nghĩ nó được ngụ ý) nếu bạn tạo giá trị mặc định bằng ràng buộc null. Tôi đoán là có một lỗi trong phiên bản của bạn làm xáo trộn siêu dữ liệu khi cột bị bỏ, để cột thứ hai của bạn trỏ vào siêu dữ liệu giá trị mặc định cho cột đầu tiên. – Boneist