Lõin andmebaasis tabeli, kus võtmeveeru puhul oleks tulnud selle väärtused süsteemil genereerida, kuid unustasin seda määrata. Lisasin tabelisse juba ridu. Kuidas see omadus tabelile tagantjärgi lisada?

Postitas Erki Eessaar 18.11.2023 11:55 (muudeti 19.11.2023 11:17)
Toon näite.

CREATE TABLE Kasutaja_rolli_omamine (kasutaja_rolli_omamine_id INTEGER NOT NULL,
kasutaja_id INTEGER NOT NULL,
rolli_kood SMALLINT NOT NULL,
alguse_aeg TIMESTAMP(0) NOT NULL,
lopu_aeg TIMESTAMP(0) NOT NULL DEFAULT 'infinity',
CONSTRAINT pk_kasutaja_rolli_omamine PRIMARY KEY (kasutaja_rolli_omamine_id),
CONSTRAINT ak_kasutaja_rolli_omamine UNIQUE (kasutaja_id, rolli_kood, alguse_aeg));
/*Loon tabeli.*/

INSERT INTO Kasutaja_rolli_omamine (kasutaja_rolli_omamine_id, kasutaja_id, rolli_kood, alguse_aeg)
VALUES (1, 1, 1, LOCALTIMESTAMP(0));
/*Lisan tabelisse rea.*/

Järgnev näide teeb andmebaasis muudatused, mis võtmeveeru puhul SERIAL notatsiooni kasutamise korral oleks tehtud automaatselt.

CREATE SEQUENCE kasutaja_rolli_omamine_kasutaja_rolli_omamine_id_seq
OWNED BY Kasutaja_rolli_omamine.kasutaja_rolli_omamine_id;

/*Loon arvujada generaatori ning määran, et selle omanik on võtmeveerg. See tagab, et tabeli kustutamisel kustutatakse automaatselt ka arvujada generaator.
Kasutan arvujada generaatori puhul nime mustrit <tabeli nimi>_<veeru nimi>_seq, mida PostgreSQL kasutab ka automaatselt loodud arvujada generaatorite puhul.*/

ALTER TABLE Kasutaja_rolli_omamine
ALTER COLUMN kasutaja_rolli_omamine_id
SET DEFAULT nextval('kasutaja_rolli_omamine_kasutaja_rolli_omamine_id_seq');
/*Määran võtmeveerule vaikimisi väärtuse, mis küsitakse nextval funktsiooniga arvujada generaatori poole pöördumisel.*/

SELECT setval('kasutaja_rolli_omamine_kasutaja_rolli_omamine_id_seq', Max(kasutaja_rolli_omamine_id))
FROM Kasutaja_rolli_omamine;
/*Määran setval funktsiooni abil, milline on viimane arvujada generaatori väljastatav väärtus. Järgmine väljastatav väärtus on sellest arvujada generaatori sammu (vaikimisi 1) võrra suurem. See on vajalik, et rea lisamisel ei tekitaks uus genereeritud väärtus konflikti andmebaasis juba olemasoleva võtmeväärtusega. Oht on selles, et samal ajal võivad kasutajad lisada tabelisse lisada uusi ridu, mida see Max päring ei näe.*/

Järgnev näide pakub alternatiivse lahenduse - määrab, et tabeli veerg on identiteedi veerg. Ka selle korral tekib automaatselt arvujada generaator, mis seotakse võtmeveeruga.

DROP TABLE IF EXISTS Kasutaja_rolli_omamine;

Loon tabeli uuesti ning lisan sinna rea.

ALTER TABLE Kasutaja_rolli_omamine
ALTER COLUMN kasutaja_rolli_omamine_id ADD GENERATED  ALWAYS AS IDENTITY (START WITH 2);
/*GENERATED ALWAYS - isegi kui kasutaja lisab veergu ise väärtuse, siis seda ei arvestata.
START WITH 2 - esimene väljastatud väärtus on 2 (sest väärtust 1 on tabelis kasutatud).*/

Arvujada generaatorite loomine ning tabeli veeru identiteedi veeruks määramine on kirjeldatud SQL standardis. SERIAL notatsiooni kasutamine on PostgreSQL laiendus.

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!