2013-06-12 5 views
1

У меня есть тип перечисления со значением по умолчанию, как:PostgreSQL перечисление по умолчанию неудачи

app_type apps_status NOT NULL DEFAULT 'undeployed'::apps_status 

Но теперь, когда я пытаюсь вставить я получаю APP_TYPE ошибки не может быть пустой. Также, когда вы продолжите попытки, вы получите ошибку: Number has already been taken. Любая идея, почему это происходит?

+1

Видимо Rails передает значение NULL (вместо ключевого слова 'default' или просто опустив столбец) –

+0

Но те же самые рельсы приложение работает с MySQL. – zulq

+2

MySQL, как известно, заменяет значения, не сообщая вам (или разрешать нули в непустых столбцах) –

ответ

0

Спасибо всем, кто помогал. Однако после тщательного исследования я понял, что PostgreSQL ENUM не поддерживает дефолт, но домены делают это, вместо этого я использую домен. Домен работает нормально и вставляет значение по умолчанию. Смотрите следующую ссылку: http://www.sqlines.com/postgresql/how-to/create_user_defined_type

2

Проблема заключается в ограничении NOT NULL, которое заполнено ORM, и не откладывается.

Прежде всего, попробуйте установить значение DEFAULT на стороне ORM.

Если это решение не выполнимо в вашем ОРМ, попробуйте добавить триггер, который устанавливает значение по умолчанию:

create function make_default() returns trigger as $$ 
begin 
    new.app_status := 'undeployed'::apps_status 
    return null; 
end; 
$$ language plpgsql; 

create trigger before insert or delete on yourtable 
for each row when (new.app_type is null) 
execute procedure make_default(); 

Если это не работает, либо, падение NOT NULL ограничение вообще, и применять его с вместо этого:

create function reject_row() returns trigger as $$ 
begin 
    raise exception 'rejected!' 
    return null; 
end; 
$$ language plpgsql; 

create constraint trigger after insert or delete on yourtable 
for each row when (new.app_type is null) 
execute procedure reject_row(); 
+0

Что-то вроде 'before_validation: initialize_stuff,: if =>: new_record?' (Где метод 'initialize_stuff' будет устанавливать начальное значение, если необходимо) в сочетании с проверкой, чтобы убедиться, что она установлена должен сделать трюк. –

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