2016-11-14 2 views
0

Я использую PSQL, и я пытаюсь создать таблицу с столбцами REQ_TYPE и RESP_STATUS. И я решил пойти с ENUM, чтобы избежать недопустимых записей в таблице.Можем ли мы создать ENUM на столбце INTEGER в PSQL?

Я использовал этот запрос для успешного создания ENUM для REQ_TYPE.

CREATE TYPE RequestType AS ENUM('GET','POST','PUT','DELETE','PATCH');

Но для RESP_STATUS, когда я попытался ниже запрос,

CREATE TYPE ResponseStatus AS ENUM(200,201,202,204,301,302,304,400,401,403,404,405,413,415,429,500);

Я получил ответ

ERROR: syntax error at or near "200"

я уверен, что

CREATE TYPE ResponseStatus AS ENUM('200','201','202');

бы решить моя проблема. Но я просто хочу сохранить RESP_STATUS как INTEGER.

Могу ли я создать ENUM на INTEGER? Если да, то как?

ответ

1

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

Вы могли бы вместо того, чтобы искать для домена (см documentation for CREATE DOMAIN), что позволит вам эффективно «подтип» целое число со списком допустимых значений:

CREATE DOMAIN http_status AS integer 
CHECK (
    VALUE IN 
    (200,201,202,204,301,302,304,400,401,403,404,405,413,415,429,500) 
) 

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

  • Подробная информация о статусе HTTP для хранения (например, description, is_error, is_redirect)
  • Новых HTTP статусов, которые будут добавлены более легко (например, вы упускаете 410 GONE и 417 Expectation Failed из вашего примера)
1

Нет, вы не можете создать ENUM для набора целых чисел. От reading the fine manual

Enum types take a list of one or more quoted labels

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

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

+0

Во многих языках, записи в перечислении имеют как метку и значение ; Я подозреваю, что это то, чего ожидал ОП. Например, в C вы можете написать 'enum STATUS {OK = 200, NOT_FOUND = 404}' и т. Д. В качестве альтернативы они думают о чем-то ближе к «домену». Однако я согласен с вашим заключением в том, что внешний ключ в этом случае более уместен. – IMSoP