SQL: Datatyper m.m. Evgenij Thorstensen V18 Evgenij Thorstensen SQL: Datatyper m.m. V18 1 / 12
Datatyper, kort om mye Vi går en rask ekskursjon i manualen, Kap. 8. https://www.postgresql.org/docs/9.2/sql.html Evgenij Thorstensen SQL: Datatyper m.m. V18 2 / 12
Datatyper, tips Universell regel: Premature optimization is the root of all evil (Knuth) Strenger: Ikke sett vilkårlige limits Numerisk: Eksakte vs. ikke eksakte typer Tid: Timestamps or intervaller FTW; tidssoner er komplisert. Enums: Ikke SQL-standard, krever oppdatering hvis krav endres. Binary blobs: Små er greit, større filer bør ligge direkte på disk hvis de ikke er super-viktige (OBS: delte meninger). See also https://wiki.postgresql.org/wiki/don%27t_do_this Evgenij Thorstensen SQL: Datatyper m.m. V18 3 / 12
Manipulering av datatyper Ekskursjon til Kap. 9. https://www.postgresql.org/docs/9.2/sql.html Evgenij Thorstensen SQL: Datatyper m.m. V18 4 / 12
Mye vil ha mer: Arrays SQL støtter arrays som datatype. Egentlig lister. CREATE TABLE sal_emp ( name text, pay_by_quarter integer[4], schedule text[][] ); Til herligheten medfølger en haug operasjoner. Arrays kan også brukes i spørringer, array(x, Y, 3) lager en array. Evgenij Thorstensen SQL: Datatyper m.m. V18 5 / 12
Array-operasjoner Plukke ut et element: SELECT kodon[2] FROM genomsekvens... Konkatenering: g1.kodon ACU, g1.kodon g2.kodon Finne antall elementer:.. WHERE cardinality(kodon) > 100.. Sammenlikne eksakt innhold: g1.kodon = g2.kodon, g1.kodon <> g2. kodon Sammenlikne med hvert element i en array: any, all. For eksempel WHERE kodon[3] = ANY(array[ GGU, UGG, UAA ])... Flate ut en array: SELECT kromosomnr, unnest(kodon) FROM genomsekvens; https://www.postgresql.org/docs/9.2/static/ functions-array.html Evgenij Thorstensen SQL: Datatyper m.m. V18 6 / 12
Views Lagrede spørringer, til senere bruk. Kan nøstes et view kan bruke andre views. Kan bli spaghetti av det hvis ustrukturert og udokumentert. Evgenij Thorstensen SQL: Datatyper m.m. V18 7 / 12
Triggere En trigger er noe som eksekveres når en event skjer i en tabell. Tenk listeners og slike ting. Når knappen trykkes på, eksekver... Events er insert/update/delete. Veldig fleksibel mekanisme for å gjøre mye bra og potensielt mye fælt. Evgenij Thorstensen SQL: Datatyper m.m. V18 8 / 12
Triggere, eksempelcase CREATE TABLE employees( id int4 serial primary key, first_name varchar(40) NOT NULL, last_name varchar(40) NOT NULL ); CREATE TABLE employee_audits ( id int4 serial primary key, employee_id int4 NOT NULL, last_name varchar(40) NOT NULL, changed_on timestamp(6) NOT NULL ) Evgenij Thorstensen SQL: Datatyper m.m. V18 9 / 12
CREATE TRIGGER last_name_changes BEFORE UPDATE ON employees Evgenij FORThorstensen EACH ROW SQL: Datatyper m.m. V18 10 / 12 Eksempeltrigger CREATE OR REPLACE FUNCTION log_last_name_changes () RETURNS trigger AS $llnc$ BEGIN IF NEW.last_name <> OLD.last_name THEN INSERT INTO employee_audits(employee_id, last_name,changed_on) VALUES(OLD.id,OLD.last_name,now()); END IF; RETURN NEW; END; $llnc$ language plpgsql;
Trigger, generell form CREATE [ CONSTRAINT ] TRIGGER name { BEFORE AFTER INSTEAD OF } { event [ OR... ] } ON table_name [ FROM referenced_table_name ] [ NOT DEFERRABLE [ DEFERRABLE ] { INITIALLY IMMEDIATE INITIALLY DEFERRED } ] [ FOR [ EACH ] { ROW STATEMENT } ] [ WHEN ( condition ) ] EXECUTE PROCEDURE function_name ( arguments ) Evgenij Thorstensen SQL: Datatyper m.m. V18 11 / 12
Triggere, tips Nyttig for logging, kompliserte constraints, diverse bokholderi. Kan bli uoversiktlig med mange triggere med komplisert logikk. Spesielt hvis det blir en kaskade (trigger endrer annen tabell som har sine triggere). Trigger hell er et begrep. Evgenij Thorstensen SQL: Datatyper m.m. V18 12 / 12