Когда у меня есть таблица со столбцом ENUM
, и я вставляю так:
UPDATE table SET enum_col = 'enum_value';
это отлично работает, но при явном его использовании я получаю сообщение об ошибке:
UPDATE table SET enum_col = 'enum_value'::text;
ERROR: column "enum_col" is of type some_enum_type but expression is of type text
LINE 1: UPDATE table SET enum_col = 'enum_value'::text;
^
HINT: You will need to rewrite or cast the expression.
Я понимаю ошибку, но есть ли какие-то настройки, которые я могу использовать, чтобы PostgreSQL все равно их принял?
(Некоторые дополнительные сведения: я использую Npgsql для обновления данных в базе данных, и хотя я не добавляю ::text
в свой запрос, я получаю эту ошибку. Похоже, что Npgsql добавляет явные типы значений при использовании параметризованных запросов.)
Чтобы заставить это UPDATE table SET enum_col = 'enum_value'::text;
работать, вместо этого: UPDATE table SET enum_col = 'enum_value'::some_enum_type;
.
@AdrianKlaver это, безусловно, помогает, но, к сожалению, на данный момент я не могу коснуться кода C#, плюс это какой-то общий код.
Если возможно, вы должны предпочесть использовать таблицы с внешними ключами вместо типов перечислений, с которыми обычно сложно обращаться (обновление, удаление значений, вставка с помощью фреймворков,...)
К сожалению, похоже, вам не повезло. Проверка типа выполняется на ранней стадии процесса, поэтому триггер BEFORE
не работает. Пользовательский CAST
не будет работать, так как источник (текст) является общим.
@AdrianKlaver похоже, что да. Я обновлю свои параметры, чтобы иметь правильный тип. Так что мне все равно придется прикасаться к коду.
@S-Человек, да. Но ты знаешь. Устаревший код ;-)).
Вы можете создать приведение от text
к вашему типу перечисления:
CREATE TYPE my_enum AS ENUM ('one', 'two', 'three');
CREATE CAST (text AS my_enum) WITH INOUT AS ASSIGNMENT;
CREATE TABLE mytab (enum_col my_enum);
INSERT INTO mytab VALUES ('one'::text);
INSERT 0 1
Вы должны быть суперпользователем, чтобы создать приведение типов.
Помогает ли это Enums?