/* \i 'H:\\Linguaggi_1\\PostgreSQL\\Prove1_InseriErrati.sql' */


/* PROVA INSERIMENTI CHE FALLISCONO PERCHE' VIOLANO I VINCOLI DI CHIAVE PRIMARIA O CANDIDATA. */

DROP DATABASE IF EXISTS prove1; /* Cancellazione della versione precedente del db */

CREATE DATABASE prove1; /* Creazione del db */

/* Connessione al db */
\c prove1

/* Creazione dei domini */
CREATE DOMAIN Voto AS INTEGER DEFAULT 18 CHECK (VALUE >= 18 AND VALUE <= 30);

/* Creazione della tabella, che definisce i vincoli mediante la sintassi generale. */
CREATE TABLE T (
    IdeT1 INTEGER GENERATED BY DEFAULT AS IDENTITY, /* E` la sintassi standard per un intero autoincrementante. */
    Incre INTEGER GENERATED BY DEFAULT AS IDENTITY,
    Vo Voto,
    CC1 INTEGER NOT NULL,
    CC2_1 INTEGER NOT NULL,
    CC2_2 INTEGER,
    PRIMARY KEY(IdeT1),
    UNIQUE (CC1),
    UNIQUE (CC2_1, CC2_2)
);

/* Inserimento di tuple e loro visualizzazione */
INSERT INTO T(Vo, CC1, CC2_1, CC2_2) VALUES (17, 11, 22, 23); /* Associa: IdeT1 = 1, Incre = 1 */
/* ERRORE: Il valore 17 dell'attributo $vo e` esterno al dominio di Voto */

SELECT * FROM T;
/* Stampa
 idet1 | incre | vo | cc1 | cc2_1 | cc2_2
-------+-------+----+-----+-------+-------
(0 righe)
*/

INSERT INTO T(Vo, CC1, CC2_1, CC2_2) VALUES (18, 12, 23, 24); /* Associa: IdeT1 = 2, Incre = 2 */
/* Inoltre, stampa INSERT 0 1:
  ~ il primo numero dopo INSERT e` sempre 0.
  ~ il secondo numero dopo INSERT indica il numero di righe inserite dal comando (in questo caso e` 1).
*/

INSERT INTO T(Vo, CC1, CC2_1, CC2_2) VALUES (30, 12, 25, 26); /* Associa: IdeT1 = 3, Incre = 3 */
/* ERRORE: La chiave (cc1)=(12) esiste già. */

INSERT INTO T(Vo, CC1, CC2_1, CC2_2) VALUES (21, 14, 27, 28); /* Associa: IdeT1 = 4, Incre = 4 */

INSERT INTO T(Vo, CC1, CC2_1, CC2_2) VALUES (22, 15, 24, 24); /* Associa: IdeT1 = 5, Incre = 5 */

INSERT INTO T(Vo, CC1, CC2_1) VALUES (22, 17, 24); /* Associa: IdeT1 = 6, Incre = 6 */

SELECT * FROM T;
/* Stampa
 idet1 | incre | vo | cc1 | cc2_1 | cc2_2
-------+-------+----+-----+-------+-------
     2 |     2 | 18 |  12 |    23 |    24
     4 |     4 | 21 |  14 |    27 |    28
     5 |     5 | 22 |  15 |    24 |    24
     6 |     6 | 22 |  17 |    24 |
*/

DELETE FROM T;

SELECT * FROM T;
/* Stampa
 idet1 | incre | vo | cc1 | cc2_1 | cc2_2
-------+-------+----+-----+-------+-------
(0 righe)
*/

DROP TABLE T;

SELECT * FROM T; /* ERRORE: la tabella 'T' non esiste */

/* Creazione della tabella, che definisce i vincoli mediante la sintassi specifica per un unico attributo. */
CREATE TABLE T (
    IdeT1 INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    CC1 INTEGER NOT NULL UNIQUE
);

SELECT * FROM T;
