2017-02-15 1 views
2

Я испытал эту ошибку в прошлом в различных экземплярах Oracle 11g. На самом деле, нет доступа лично к поддержке Oracle, чтобы узнать, является ли проблема идентифицированной/разрешенной.Ошибка Oracle при добавлении столбцов с нулевым значением по умолчанию

Ошибка приводит к тому, что запрос всегда возвращает значение по умолчанию для столбца, даже если запись имеет другое значение.

Он проявляется только в определенных запросах, и это вызвано добавлением столбца с недействительными значениями по умолчанию в ранее существовавшей таблице с использованием одного предложения о добавлении.

Подробнее см. Ниже.

DROP TABLE testBugMain; 
DROP TABLE testBugAdditional; 

-- Create two tables related to one another through real or apparent FK. 
CREATE TABLE testBugMain (
    mainid NUMBER(1) NOT NULL, 
    str VARCHAR(200) NULL, 
    CONSTRAINT PK_testBugMain PRIMARY KEY (mainid) 
); 
CREATE TABLE testBugAdditional (
    additionalid NUMBER(1) NOT NULL, 
    mainid NUMBER(1) NOT NULL, 
    CONSTRAINT PK_testBugAdditional PRIMARY KEY (additionalid) 
); 

-- Insert a couple of values on both. 
INSERT INTO testBugMain (mainid, str) VALUES (1, 'test-with-1'); 
INSERT INTO testBugMain (mainid, str) VALUES (2, 'test-with-2'); 
INSERT INTO testBugMain (mainid, str) VALUES (3, 'test-with-3'); 

INSERT INTO testBugAdditional (additionalid, mainid) VALUES (1, 1); 
INSERT INTO testBugAdditional (additionalid, mainid) VALUES (2, 2); 
INSERT INTO testBugAdditional (additionalid, mainid) VALUES (3, 3); 

-- Required for bug to manifest: add a new column, NOT NULL, with DEFAULT value (5 in this case). 
-- It needs to be added through an ALTER and both DEFAULT and NOT NULL in the same sentence for the bug to manifest. 
ALTER TABLE testBugAdditional ADD bug NUMBER(1) DEFAULT 5 NOT NULL; 

-- Update the value on the column, so the query below should return these values instead of 5's. 
UPDATE testBugAdditional SET bug = 1 WHERE mainid = 1; 
UPDATE testBugAdditional SET bug = 2 WHERE mainid = 2; 
UPDATE testBugAdditional SET bug = 3 WHERE mainid = 3; 

-- Sanity check (returned values are correct). 
SELECT ma.mainid, ma.str, ad.bug FROM testBugMain ma INNER JOIN testBugAdditional ad ON ma.mainid = ad.mainid; 

-- Insanity check (returned values are default values). 
SELECT mainid, str, bug FROM 
(
    SELECT ma.mainid, ma.str, ad.bug FROM testBugMain ma 
    LEFT JOIN -- Required for bug to manifest (left join). 
    testBugAdditional ad ON ma.mainid = ad.mainid 
    ORDER BY ma.mainid ASC -- Required for bug to manifest (any order by, perhaps?). 
) 
WHERE rownum < 6 -- Required for bug to manifest (pagination);​ 

Хотя запрос обнажая ошибку кажется несколько запутанными, я полагаю, на самом деле не что странно иметь упорядоченный, постраничный запрос с левыми присоединяются (и, учитывая все обстоятельства, имеющий манифеста ошибку редко, вероятно, хуже) ,

Вопросы

Является ли это идентифицированный/решен вопрос с помощью Oracle?

Есть ли способы обхода проблемы?

+1

Возникли вопросы? – BobC

+0

У вас есть номер ошибки? Если это так, я могу узнать, было ли исправлено исправление. – BobC

+0

Хороший вопрос, я как бы предполагал, что вопросы были неявными, но теперь добавили их непосредственно к деталям. Часть этого (обходной путь) я ответил сам, чтобы получить знания. –

ответ

2

Решение/Обход

Чтобы обойти эту проблему, всегда добавлять не-Nullable столбцы к существующим таблицам аналогично следующему:

-- Add the column as nullable with a default. 
ALTER TABLE existingTable ADD newColumn NUMBER(1) DEFAULT 5; 
-- Add the not-null constraint. 
ALTER TABLE existingTable MODIFY newColumn NOT NULL; 
1

Проблема не воспроизводится в 12.1 Вот мой вывод из вашего тестового примера

MAINID STR       BUG 
---------- -------------------- ---------- 
     1 test-with-1     1 
     2 test-with-2     2 
     3 test-with-3     3 


    MAINID STR       BUG 
---------- -------------------- ---------- 
     1 test-with-1     1 
     2 test-with-2     2 
     3 test-with-3     3 

Кстати, спасибо, что собрал превосходный предоставил тестовый чехол. Это отличный пример того, как публиковать сообщения.

Смежные вопросы