Kas PostgreSQLi DATE ja TIMESTAMP tüüpi veergude kitsenduste puhul tuleb arvestada spetsiaalväärtusega 'infinity'?

Postitas Erki Eessaar 27.10.2022 10:30 (muudeti 27.10.2022 10:31)
Jah, mõnikord tuleb. Toon näite.

PostgreSQLi DATE ja TIMESTAMP tüüpidesse kuuluvad spetsiaalväärtused 'infinity' (suurem kui kõik ülejäänud DATE/TIMESTAMP väärtused) ja '-infinity' (väiksem kui kõik ülejäänud DATE/TIMESTAMP väärtused).

CREATE TABLE Bronn (bronn_id SERIAL,
ruumi_nr INTEGER NOT NULL,
alguse_aeg TIMESTAMP NOT NULL,
lopu_aeg TIMESTAMP NOT NULL DEFAULT 'infinity',
CONSTRAINT pk_bronn PRIMARY KEY (bronn_id),
CONSTRAINT ak_bronn UNIQUE (ruumi_nr, alguse_aeg),
CONSTRAINT chk_bronn_alguse_aeg CHECK(alguse_aeg>='2020-01-01' AND alguse_aeg<'2200-01-01'),
CONSTRAINT chk_bronn_lopu_aeg CHECK(lopu_aeg>='2020-01-01' AND lopu_aeg<'2200-01-01'));

INSERT INTO Bronn (ruumi_nr, alguse_aeg)
VALUES (1, '2022-10-04 12:00'),
(2, '2022-10-04 12:00');

/*Lisamine ebaõnnestub
ERROR:  new row for relation "bronn" violates check constraint "chk_bronn_lopu_aeg"
DETAIL:  Failing row contains (1, 1, 2022-10-04 12:00:00, infinity).*/

ALTER TABLE Bronn DROP CONSTRAINT chk_bronn_lopu_aeg;

ALTER TABLE Bronn ADD CONSTRAINT chk_bronn_lopu_aeg CHECK(lopu_aeg>='2020-01-01' AND lopu_aeg<'2200-01-01' OR lopu_aeg='infinity');

INSERT INTO Bronn (ruumi_nr, alguse_aeg)
VALUES (1, '2022-10-04 12:00'),
(2, '2022-10-04 12:00');

/*Lisamine õnnestub*/

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!