2008-12-03 14 views
10

Respondiendo a esta pregunta: "Database enums - pros and cons", me gustaría saber qué sistemas de bases de datos son compatibles con los tipos de datos de enumeración, y un poco de detalles sobre cómo lo hacen (por ejemplo, qué se almacena internamente, cuáles son los límites, implicaciones de sintaxis de consulta , implicaciones de indexación, ...).¿Qué sistemas de bases de datos admiten un tipo de datos ENUM, que no?

La discusión de los casos de uso o los pros y contras debe tener lugar en las otras preguntas.

Respuesta

4

Oracle no admite ENUM en absoluto.

8

sé que MySQL apoyo ENUM:

  • el tipo de datos se implementa como valor entero con las secuencias asociadas
  • se puede tener un máximo de 65.535 elementos para una sola enumeración
  • cada cadena tiene un equivalente numérico, contando desde 1, en el orden de definición
  • el valor numérico del campo es accesible a través de "SELECT enum_col+0"
  • en non-str tic Modo SQL, la asignación de valores que no están en la lista no necesariamente da como resultado un error, sino que se asigna un valor de error especial en su lugar, teniendo el valor numérico 0
  • clasificación en orden numérico (p. orden de la definición), no por orden alfabético de la cadena equivalentes
  • asignación o bien que funciona a través de la cadena de valor o el número de índice
  • esto: ENUM('0','1','2') deben evitarse, porque '0' tendría valor entero 1
7

PostgreSQL soporta ENUM de 8.3 en adelante. Para versiones anteriores, puede utilizar:

Puede simular un ENUM haciendo algo como esto:

CREATE TABLE persons (
    person_id int not null primary key, 
    favourite_colour varchar(255) NOT NULL, 
    CHECK (favourite_colour IN ('red', 'blue', 'yellow', 'purple')) 
); 

Usted también podría tener:

CREATE TABLE colours (
    colour_id int not null primary key, 
    colour varchar(255) not null 
) 
CREATE TABLE persons (
    person_id int not null primary key, 
    favourite_colour_id integer NOT NULL references colours(colour_id), 
); 

que tendría agrega un join cuando conoces el color favorito, pero tiene la ventaja de que puedes agregar colores simplemente agregando una entrada a la tabla de colores, y no que no necesites cambiar el esquema cada vez. También podría agregar atributos al color, como el código HTML o los valores RVB.

También podría crear su propio tipo que hace una enumeración, pero no creo que sea más rápido que el varchar y el CHECK.

+0

PostgreSQL admite ENUM desde la versión 8.3 (ver mi respuesta). – bortzmeyer

+0

Gracias, edité mi respuesta para reflejar eso. – mat

2

A diferencia de lo que dijo estera, PostgreSQL does support ENUM (desde la versión 8.3 , el último):

essais=> CREATE TYPE rcount AS ENUM (
essais(> 'one', 
essais(> 'two', 
essais(> 'three' 
essais(>); 
CREATE TYPE 
essais=> 
essais=> CREATE TABLE dummy (id SERIAL, num rcount); 
NOTICE: CREATE TABLE will create implicit sequence "dummy_id_seq" for serial column "dummy.id" 
CREATE TABLE 
essais=> INSERT INTO dummy (num) VALUES ('one'); 
INSERT 0 1 
essais=> INSERT INTO dummy (num) VALUES ('three'); 
INSERT 0 1 
essais=> INSERT INTO dummy (num) VALUES ('four'); 
ERROR: invalid input value for enum rcount: "four" 
essais=> 
essais=> SELECT * FROM dummy WHERE num='three'; 
id | num 
----+------- 
    2 | three 
    4 | three 

Hay algunas funciones que work specifically on enums.

La indexación funciona bien en los tipos enum.

Según el manual, la aplicación es el siguiente:

Un valor de enumeración ocupa cuatro bytes en el disco. La longitud de la etiqueta textual del valor enum está limitada por la configuración NAMEDATALEN compilada en PostgreSQL; en construcciones estándar esto significa a lo sumo 63 bytes.

Las etiquetas Enum distinguen entre mayúsculas y minúsculas, por lo que "feliz" no es lo mismo que "HAPPY". Los espacios en las etiquetas son importantes también.

+0

¿Puedes averiguar qué versión fue la primera en admitir ENUM y publicar esa información aquí? ¡Gracias! (Tal vez también pueda recopilar información adicional sobre cómo funcionan internamente). – Tomalak

+0

Listo. Agregué todos los detalles solicitados. – bortzmeyer

4

AFAIK, ni IBM DB2 ni IBM Informix Dynamic Server admiten tipos de ENUM.

Cuestiones relacionadas