Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

378
Vistas
Verifique la restricción en la clave más grande de HSTORE en Postgres

Me gustaría crear una restricción de verificación en el campo HSTORE que contiene datos en el siguiente formato:

 { 1 => 2020-03-01, 2 => 2020-03-07, etc, etc, etc, }

Donde clave es siempre un dígito positivo y valor es una fecha.

Problema aquí que quiero extraer claves (por akeys ), y luego de alguna manera obtener la clave más grande y compararla con number_of_episodes (entero positivo). Pero dice que no puedo usar matrices en la restricción de verificación.

La pregunta es: ¿es posible extraer de alguna manera la clave más grande de HSTORE como un número entero y luego usarla en la restricción de verificación?

Gracias.

 alter table archives_seasonmodel add constraint test check (max((unnest(akeys(episodes))) <= number_of_episodes ))

esto no funciona

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Esto funciona para mí en PostgreSQL 10:

 # create table tvseries (number_of_episodes int, episodes hstore, check (number_of_episodes >= all (akeys(episodes)::int[])) ); CREATE TABLE # insert into tvseries values (2, '1=>"a", 2=>"b"'); INSERT 0 1 # insert into tvseries values (1, '1=>"a", 2=>"b"'); ERROR: new row for relation "tvseries" violates check constraint "tvseries_check" DETAIL: Failing row contains (1, "1"=>"a", "2"=>"b"). # insert into tvseries values (2, '1=>"a"'); INSERT 0 1 # select * from tvseries; number_of_episodes | episodes --------------------+-------------------- 2 | "1"=>"a", "2"=>"b" 2 | "1"=>"a" (2 rows)
over 4 years ago · Santiago Trujillo Denunciar

0

Esta respuesta describe un par de formas en que puede hacer esto. La primera es usar la extensión intarray y su función sort_desc , pero creo que el mejor enfoque aquí es usar una función personalizada.

 testdb=# create extension hstore; CREATE EXTENSION testdb=# create table tt0(h hstore, max_n bigint); CREATE TABLE testdb=# CREATE OR REPLACE FUNCTION array_greatest(anyarray) RETURNS anyelement LANGUAGE SQL AS $$ SELECT max(x) FROM unnest($1) as x; $$; CREATE FUNCTION testdb=# alter table tt0 add check((array_greatest(akeys(h)::integer[]))<=max_n); ALTER TABLE testdb=# insert into tt0 select hstore(ARRAY[['1','asdf'],['3','fdsa']]), 2; ERROR: new row for relation "tt0" violates check constraint "tt0_check" DETAIL: Failing row contains ("1"=>"asdf", "3"=>"fdsa", 2). testdb=# insert into tt0 select hstore(ARRAY[['1','asdf'],['2','fdsa']]), 2; INSERT 0 1 testdb=# select * from tt0 testdb-# ; h | max_n --------------------------+------- "1"=>"asdf", "2"=>"fdsa" | 2 (1 row) testdb=# \d tt0 Table "public.tt0" Column | Type | Collation | Nullable | Default --------+--------+-----------+----------+--------- h | hstore | | | max_n | bigint | | | Check constraints: "tt0_check" CHECK (array_greatest(akeys(h)::integer[]) <= max_n)
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda