2013-06-25 2 views
0

Что не так в этой ошибке?
проверить ограничение проверить колонку дважды

альтер таблицы INFO добавить ограничение chk_app проверить (случай, когда приложение IS NULL THEN приложение = 'A');

Если его потому, что приложение = «A» Я зову его в два раза, то, как иметь проверочное ограничение, чтобы проверить, если приложение является недействительным, то оно должно иметь значение

+1

Проверочное ограничение _checks_ что-то, что вам нужно оператор сравнения (также оператор CASE нуждается в END). Если вы просто хотите убедиться, что если приложение равно null, тогда оно должно быть A, тогда вы должны использовать ответ wolφi. – Ben

ответ

3

Если вы хотите установить приложение колонки для «A» всякий раз, когда вставляются строка со значением NULL Я хотел бы использовать DEFAULT конструкцию:

ALTER TABLE info MODIFY (app VARCHAR2(xxx) DEFAULT 'A'); 

Если значение не задано во время INSERT, An «а» вставляется в колонку app. Конечно, пользователь может переопределить это поведение, явно вставив значение NULL. Это можно предотвратить с помощью NOT NULL ограничения:

ALTER TABLE info MODIFY (app VARCHAR2(xxx) DEFAULT 'A' NOT NULL); 

С Oracle версии 12с, вы можете указать требуемое поведение более четко:

ALTER TABLE info MODIFY (app VARCHAR2(xxx) DEFAULT ON NULL 'A' NOT NULL); 
+0

Это не лучший ответ, см. Ответ Петра, я привел пример: http://www.sqlfiddle.com/#!4/78aaa/1 –

3

Это флажок bacause ограничение только проверяет значение, оно не в состоянии изменить его.

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

create or replace trigger info_briu 
before insert or update of info 
for each row 
begin 
    if :new.app is null then 
    :new.app := 'A'; 
    end if; 
end; 
+1

Триггер - это массивный избыток для этой ситуации. – Ben

+0

Возможно, но если вставка содержит нулевое значение для столбца, то значение по умолчанию не будет применяться. Конечно, вставка не сделала бы этого. –

+0

Да, я согласен с Беном в большинстве случаев. но это не помогает в случаях, когда пользователь прямо хранит нулевое значение, например INSERT INTO info (app) VALUES (NULL) –