with serial ejemplos create auto_increment postgresql create-table

serial - Qué significa regclass en Postgresql



postgresql create table auto_increment id (2)

Tengo la siguiente línea en una declaración CREATE TABLE:

field1_id bigint DEFAULT nextval(''table1_field1_id_seq''::regclass) NOT NULL,

¿Qué significa regclass en el párrafo anterior? ¿Es un requisito absoluto agregar ::regclass ?

NB: He visto el enlace de la documentación de Postgresql que habla sobre el regclass , pero no pude entenderlo.


No, no es necesario que el elenco regclass cuando se llama a una función como nextval que acepta un parámetro de regclass , ya que hay un implict cast de text a regclass . En algunos otros contextos, se puede requerir un lanzamiento explícito a un regclass .

Explicación:

::regclass es un elenco, como ::integer .

regclass es un tipo de datos "mágico"; en realidad es un alias para oid , o "identificador de objeto". Ver tipos de identificador de objeto en la documentación. Casting to regclass es una forma abreviada de decir "este es el nombre de una relación, por favor conviértalo al oid de esa relación". Los moldes a regclass son conscientes del search_path , a diferencia de consultar pg_class para el oid una relación directamente, por lo que el casting a regclass no es exactamente equivalente a la subconsulta de pg_class .

Las tablas son relaciones. También lo son las secuencias y las vistas. De modo que puede obtener el aspecto de una vista o secuencia al convertir también en un registro.

Existen moldes implícitos definidos para el text a la regclass , por lo que si regclass explícita y llamas a una función que acepta el regclass la regclass se realiza automáticamente. Por lo tanto, no lo necesita en, por ejemplo, llamadas a nextval .

Hay otros lugares donde puedes. Por ejemplo, no puede comparar text directamente con oid ; para que puedas hacer esto:

regress=> select * from pg_class where oid = ''table1''::regclass;

pero no esto:

regress=> select * from pg_class where oid = ''table1''; ERROR: invalid input syntax for type oid: "table1" LINE 1: select * from pg_class where oid = ''table1'';

Solo por diversión intenté escribir una consulta que realizara la operación equivalente de casting a regclass . No lo use, es principalmente por diversión, y como un intento de demostrar lo que realmente está sucediendo. A menos que estés realmente interesado en cómo funcionan las tripas de Pg, puedes dejar de leer aquí.

Según lo entiendo, ''sequence_name''::regclass::oid es más o menos equivalente a la siguiente consulta:

WITH sp(sp_ord, sp_schema) AS ( SELECT generate_series(1, array_length(current_schemas(''t''),1)), unnest(current_schemas(''t'')) ) SELECT c.oid FROM pg_class c INNER JOIN pg_namespace n ON (c.relnamespace = n.oid) INNER JOIN sp ON (n.nspname = sp.sp_schema) WHERE c.relname = ''sequence_name'' ORDER BY sp.sp_ord LIMIT 1;

excepto que es mucho más corto y mucho más rápido. Consulte Funciones de información del sistema para la definición de current_schemas(...) , etc.

En otras palabras:

  • Obtenga una matriz ab que liste todos los esquemas a los que tenemos acceso y empareje cada entrada con un número ordinal para su posición en la matriz
  • Busque en pg_class relaciones con los nombres coincidentes y pg_class con su espacio de nombres (esquema)
  • Ordene la lista de relaciones restantes por el orden en que aparecieron sus esquemas en search_path
  • y elige el primer partido

Por lo que entiendo de la documentación, oid se subdividen en tipos. regclass son objetos de base de datos que representan relaciones (para que pertenezcan a la tabla de metadatos pg_class).

Expresa una dependencia entre la secuencia y la expresión DEFAULT (es decir, el proceso de producir un valor predeterminado si no se proporciona un valor explícito en una consulta INSERT, por ejemplo), de modo que si uno emite una DROP SEQUENCE ... en la secuencia, el la consulta no se aprobará, a menos que esté en cascada (escribiendo DROP SEQUENCE table1_field1_id_seq CASCADE ).