Andmebaasid II (ITI0207) (sügis 2023)

Küsimus

Anonüümne
Käivitan läbi psqli PostgreSQL andmebaasis CREATE TABLE lauseid. Saan ühe lause peale veateate:

ERROR: syntax error at or near "CONSTRAINT" LINE 29: SET CONSTRAINT FK_Isik_Riik FOREIGN KEY (isikukoodi_riik) RE...

Samas selles lauses ei ole SET CONSTRAINT fraasi. Milles on viga ja kuidas seda parandada?

Failid:

Vastus (01.11.2022 14:47): Vea põhjus on CREATE TABLE lauses olevas tabeldusmärgis. See probleem esines kuni PostgreSQL 14 (kaasa arvatud). PostgreSQL 15 see probleem lahendati.

Näiteks saan sellise veateate, kui käivitan lause tabeli C loomiseks (kogu katsetuse skript on küsimusele lisatud failis).

1.CREATE TABLE C(c_id INTEGER PRIMARY KEY,
2.    a_id INTEGER NOT NULL,
3.    b_id INTEGER NOT NULL,
4.    CONSTRAINT ak_c UNIQUE (a_id, b_id),
5.    CONSTRAINT fk_c_a FOREIGN KEY (a_id) REFERENCES A(a_id) ON DELETE No Action ON UPDATE Cascade,
6.    CONSTRAINT fk_c_b FOREIGN KEY (b_id) REFERENCES B(b_id) ON DELETE No Action ON UPDATE Cascade
7.);

Veateade: ERROR: syntax error at or near "CONSTRAINT"
LINE 6: SET CONSTRAINT fk_c_b FOREIGN KEY (b_id) REFERENCES B(b_id) ...

Viga tekib sellest, et psql ei saa mõnikord tabeldusmärkidega hakkama. Reas nr 5 on võtmesõna UPDATE. Sellele järgneb rea nr 6 alguses tabeldusmärk. See paneb psqli arvama, et UPDATE on eraldi lause.

Kuidas seda probleemi lahendada?

  • Kustutage skriptist enne käivitamist tabeldusmärgid (tekstiredaktoris Search and Replace funktsioon).
  • Käivitage skripti pgAdminis (seal seda probleemi ei ole).
  • Panete (näiteks WinSCP programmi abil) skriptifaili apex2.ttu.ee serveris enda kodukataloogi (/home/kasutajanimi - satute sinna sisselogimisel). Seejärel käivitate shelli promptist selle skripti üldise käsuga:

    psql -f skriptifaili nimi andmebaasi nimi, kus soovite skripti käivitada

    Näiteks järgmine käsk käivitab failis DDL_PostgreSQL.sql olevad laused andmebaasis proov.

    psql -f DDL_PostgreSQL.sql proov

Hinda vastust:

Keskmine hinne: Pole veel hinnanguid!