PostgreSQL: nombres de restricciones predeterminados

85

Al crear una tabla en PostgreSQL, se asignarán nombres de restricción predeterminados si no se proporcionan:

CREATE TABLE example (
    a integer,
    b integer,
    UNIQUE (a, b)
);

Pero al usar ALTER TABLEpara agregar una restricción, parece que un nombre es obligatorio:

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);

Esto ha causado algunas inconsistencias en los nombres de los proyectos en los que he trabajado y genera las siguientes preguntas:

  1. ¿Existe una forma sencilla de agregar una restricción a una tabla existente con el nombre que habría recibido si se hubiera agregado durante la creación de la tabla?

  2. Si no es así, ¿deberían evitarse por completo los nombres predeterminados para evitar inconsistencias?

Ian Mackinnon
fuente
3
Establezco una regla para evitar los nombres predeterminados solo por esta razón: terminas con la situación en la que en cada implementación las restricciones tienen nombres diferentes.
Paul Tomblin

Respuestas:

35

El manual es bastante claro sobre esto (" tableconstraint: este formulario agrega una nueva restricción a una tabla usando la misma sintaxis que CREATE TABLE. ")

Entonces simplemente puedes ejecutar:

ALTER TABLE ejemplo ADD UNIQUE (a, b);
un caballo sin nombre
fuente
5
¡Ah! Estaba incluyendo por error Me CONSTRAINTgusta ALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);y obtenía errores. ¡Gracias!
Ian Mackinnon
275

Los nombres estándar para índices en PostgreSQL son:

{tablename}_{columnname(s)}_{suffix}

donde el sufijo es uno de los siguientes:

  • pkey para una restricción de clave principal
  • key para una restricción única
  • excl para una restricción de exclusión
  • idx para cualquier otro tipo de índice
  • fkey para una clave externa
  • check para una restricción de comprobación

El sufijo estándar para secuencias es

  • seq para todas las secuencias

Prueba de su restricción ÚNICA:

AVISO: CREATE TABLE / UNIQUE creará un índice implícito "example_a_b_key" para la tabla "example"

Frank Heikens
fuente
10
Muy útil, gracias! Vale la pena agregar que las claves externas usan el sufijo fkeyy que las restricciones de claves externas de varias columnas solo parecen incluir el nombre de la primera columna.
Ian Mackinnon
1
@IanMackinnon, ¡esta debería ser la mejor respuesta!
Marcio Mazzucato
¡Esta información es oro! Puede confirmarlos ejecutando, por ejemploCREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson
6
Exactamente la respuesta que estaba buscando al buscar en Google "convenciones de nomenclatura de índices de postgresql"
Fancy John
1
@alguien ah lo siento, supongo que me refiero al final de E.4.3.3 Comandos de utilidad. Es el último elemento de viñeta antes de E.4.3.4 Tipos de datos: "Utilice los nombres de todas las columnas de clave al seleccionar nombres de restricciones predeterminados para claves externas (Peter Eisentraut)"
Michael Hewson