2016-11-14 4 views
0

Ich verwende PSQL und ich versuche, eine Tabelle mit den Spalten REQ_TYPE und RESP_STATUS zu erstellen. Und ich habe mich entschieden, mit ENUM zu gehen, um ungültige Einträge in der Tabelle zu vermeiden.Können wir ENUM in der Spalte INTEGER in PSQL erstellen?

Ich habe diese Abfrage verwendet, um ENUM für REQ_TYPE erfolgreich zu erstellen.

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

Aber für RESP_STATUS, wenn ich die folgende Abfrage versucht,

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

I

ERROR: syntax error at or near "200"

die Antwort bekam, dass ich bin sicher, dass

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

lösen würde mein Problem. Aber ich möchte RESP_STATUS nur als INTEGER behalten.

Kann ich ENUM auf INTEGER erstellen? Wenn ja, wie?

Antwort

1

Ein Enum ist eine Menge von beliebigen Labels, die nur ihnen selbst gleich sind; Sie sind keine Einschränkung für Werte eines bestimmten Typs. Stellen Sie sich die Zeichenfolgen in der Typdefinition mehr wie Spaltennamen oder Programmiersprachenkonstanten als tatsächliche Werte vor.

Sie könnten stattdessen für eine Domain suchen (documentation for CREATE DOMAIN sehen), die Sie mit einer Liste der zulässigen Werte effektiv „Untertyp“ integer erlauben würde:

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) 
) 

jedoch, wie in Mike Sherrill's answer vorgeschlagen, es könnte besser geeignet sein, eine normale ganze Spalte mit einem Fremdschlüssel von bekannten HTTP-Statuscodes in eine Liste zeigt auf, da dies ermöglicht:

  • Details zu dem HTTP-Status gespeichert werden (zB description, is_error, is_redirect)
  • Neuer HTTP-Status leichter hinzugefügt werden (zum Beispiel, sind Sie 410 GONE und 417 Expectation Failed aus Ihrem Beispiel) fehlen
1

Nein, Sie können kein ENUM für eine Reihe von ganzen Zahlen erstellen. Von reading the fine manual

Enum types take a list of one or more quoted labels

Ich kann nicht verstehen, warum Sie eine ENUM von ganzen Zahlen wollen würden. Verwenden Sie Ganzzahlen entweder direkt in einer CHECK-Integritätsregel oder mit einem Fremdschlüssel, der auf eine Tabelle gültiger Ganzzahlen verweist.

Für HTTP-Statuscodes, die Ihr Ziel zu sein scheinen, ist ein Fremdschlüsselverweis auf eine Tabelle mit HTTP-Statuscodes und deren Bedeutung sehr sinnvoll.

+0

In vielen Sprachen, Einträge in einer Enum haben beide ein Label und einen Wert ; Ich vermute, dass dies das ist, was der OP erwartet hat. Zum Beispiel könnte man in C »enum ​​STATUS {OK = 200, NOT_FOUND = 404}« schreiben usw. Alternativ denken sie an etwas, das näher an einer "Domäne" liegt. Ich stimme Ihrer Schlussfolgerung zu, dass ein Fremdschlüssel in diesem Fall besser geeignet ist. – IMSoP

Verwandte Themen