Kodulehed
[385] - Andmebaasid II (ITI0207) (sügis 2023)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid.
Värvilised mummud tähistavad hinnangulist kataloogide lugemise vajadust. Roheline - suurim, kollane - keskmine, punane või mummuta - väikseim
Isiklik
Lisainfo Info ainult Sulle - teised kasutajad seda ei näe
Abi
Lisainfo Võimalus küsida õppejõult abi (nagu foorum, kus saab küsida küsimusi ja kommenteerida vastuseid)
Mitmesugust
Abi / Kasutajatugi / PostgreSQL

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Anonüümne (18.11.2023 11:45):
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?
Vastus (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 vastust:

Keskmine hinne : Pole veel hinnanguid!