CREAR DOMINIO: definir un nuevo dominio

Sinopsis

CREATE DOMAIN name [AS] data_type
    [COLLATE collation ][DEFAULT expression ][constraint[...]]whereconstraintis:

[CONSTRAINT constraint_name ]
NULL

Descripción

CREATE DOMAIN crea un nuevo dominio. Un dominio es esencialmente un tipo de datos con restricciones opcionales (restricciones sobre el conjunto de valores permitido). El usuario que define un dominio se convierte en su propietario.

Si se proporciona un nombre de esquema (por ejemplo, CREATE DOMAIN myschema.mydomain ...), el dominio se crea en el esquema especificado. De lo contrario, se crea en el esquema actual. El nombre de dominio debe ser único entre los tipos y dominios existentes en su esquema.

Los dominios son útiles para abstraer las restricciones comunes de los campos en una única ubicación para su mantenimiento. Por ejemplo, varias tablas pueden contener columnas de direcciones de correo electrónico y todas requieren la misma restricción CHECK para verificar la sintaxis de la dirección. Defina un dominio en lugar de configurar la restricción de cada tabla individualmente.

Para poder crear un dominio, debe tener USAGE privilegio sobre el tipo subyacente.

Parámetros

name

El nombre (opcionalmente calificado por esquema) de un dominio que se creará.

data_type

El tipo de datos subyacente del dominio. Esto puede incluir array especificadores.

collation

Una colación opcional para el dominio. Si no se especifica ninguna intercalación, se utiliza la intercalación predeterminada del tipo de datos subyacente. El tipo subyacente debe poder clasificarse si COLLATE está especificado.

DEFAULT expression

los DEFAULT cláusula especifica un valor predeterminado para las columnas del tipo de datos de dominio. El valor es cualquier expresión libre de variables (pero no se permiten subconsultas). El tipo de datos de la expresión predeterminada debe coincidir con el tipo de datos del dominio. Si no se especifica ningún valor predeterminado, entonces el valor predeterminado es el null valor.

La expresión predeterminada se utilizará en cualquier operación de inserción que no especifique un valor para la columna. Si se define un valor predeterminado para una columna en particular, anula cualquier valor predeterminado asociado con el dominio. A su vez, el dominio predeterminado anula cualquier valor predeterminado asociado con el tipo de datos subyacente.

CONSTRAINT constraint_name

Un nombre opcional para una restricción. Si no se especifica, el sistema genera un nombre.

NOT NULL

Se evita que los valores de este dominio sean null (pero vea las notas a continuación).

NULL

Los valores de este dominio pueden ser null. Este es el predeterminado.

Esta cláusula solo está destinada a la compatibilidad con bases de datos SQL no estándar. Se desaconseja su uso en nuevas aplicaciones.

CHECK (expression)

CHECK las cláusulas especifican restricciones de integridad o pruebas que deben satisfacer los valores del dominio. Cada restricción debe ser una expresión que produzca un resultado booleano. Debería usar el key palabra VALUE para referirse al valor que se está probando. Las expresiones que se evalúan como VERDADERO o DESCONOCIDO tienen éxito. Si la expresión produce un resultado FALSO, se informa un error y no se permite convertir el valor al tipo de dominio.

En la actualidad, CHECK Las expresiones no pueden contener subconsultas ni hacer referencia a variables distintas de VALUE.

Cuando un dominio tiene varios CHECK restricciones, se probarán en orden alfabético por nombre. (Las versiones de PostgreSQL anteriores a 9.5 no respetaban ningún orden de activación en particular para CHECK limitaciones.)

Notas

Restricciones de dominio, particularmente NOT NULL, se comprueban al convertir un valor al tipo de dominio. Es posible que una columna que es nominalmente del tipo de dominio se lea como null a pesar de que existe tal limitación. Por ejemplo, esto puede suceder en una consulta de combinación externa, si la columna de dominio está en el lado anulable de la combinación externa. Un ejemplo más sutil es

INSERTINTO tab (domcol)VALUES((SELECT domcol FROM tab WHEREfalse));

El sub-SELECT escalar vacío producirá un null valor que se considera del tipo de dominio, por lo que no se le aplica ninguna comprobación de restricciones adicional y la inserción se realizará correctamente.

Es muy difcil evitar tales problemas, debido a la suposicin general de SQL de que un null valor es un valor válido de cada tipo de datos. Por lo tanto, la mejor práctica es diseñar las restricciones de un dominio para que null se permite el valor, y luego aplicar la columna NOT NULL restricciones a las columnas del tipo de dominio según sea necesario, en lugar de directamente al tipo de dominio.

PostgreSQL asume que CHECK Las condiciones de las restricciones son inmutables, es decir, siempre darán el mismo resultado para el mismo valor de entrada. Esta suposición es lo que justifica examinar CHECK restricciones solo cuando un valor se convierte por primera vez para ser de un tipo de dominio, y no en otros momentos. (Esto es esencialmente el mismo que el tratamiento de la tabla CHECK restricciones, como se describe en la Sección 5.4.1.)

Un ejemplo de una forma común de romper esta suposición es hacer referencia a una función definida por el usuario en un CHECK expresión y luego cambiar el comportamiento de esa función. PostgreSQL no lo rechaza, pero no notará si hay valores almacenados del tipo de dominio que ahora violan la CHECK restricción. Eso provocaría un error de volcado y recarga de la base de datos posterior. La forma recomendada de manejar tal cambio es eliminar la restricción (usando ALTER DOMAIN), ajuste la definición de la función y vuelva a agregar la restricción, volviéndola a comprobar con los datos almacenados.

Ejemplos de

Este ejemplo crea el us_postal_code tipo de datos y luego usa el tipo en una definición de tabla. Se utiliza una prueba de expresión regular para verificar que el valor parezca un código postal válido de EE. UU.:

CREATE DOMAIN us_postal_code ASTEXTCHECK(VALUE~'^d5$'ORVALUE~'^d5-d4$');CREATETABLE us_snail_addy (
  address_id SERIALPRIMARYKEY,
  street1 TEXTNOTNULL,
  street2 TEXT,
  street3 TEXT,
  city TEXTNOTNULL,
  postal us_postal_code NOTNULL);

Compatibilidad

El comando CREATE DOMAIN cumple con el estándar SQL.

Ver también

ALTER DOMAIN, DROP DOMAIN

Anterior Hasta próximo
CREAR BASE DE DATOS Hogar CREAR ACTIVADOR DE EVENTOS