1

Temat: Pomoc z tworzeniem pierwszej bazy danych

Witam serdecznie,
jestem studentem informatyki i jako temat zaliczenia (dopuszczenie do egzaminów) muszę wykonać bazę danych. Zadanie jakie muszę wykonać to:
muszę napisać program do obsługi danych magazynowych. Baza danych musi składać się z trzech tabel: tab1, tab2, tab3. Pola formularza nazwa i jednostka mają być polami wyboru typu select. Program powinien posiadać menu oraz uniwersalny formularz. Muszę sprawdzać poprawność wprowadzanych i edytowanych danych.
Nie chcę aby ktoś napisał mi gotowca (chociaż to nie jest zły pomysł ;) ), ale chciałbym aby ktoś pomógłby mi załapać o co w tym chodzi i wspólnymi siłami coś napisać... Czy znajdą się tutaj osoby, które pomogą w rozwiązaniu problemu?

Ja na samym początku wyskrobałem coś takiego:

DROP TABLE stany_mag;
DROP TABLE  nazwy_towarow;
DROP TABLE  jednostki;
CREATE TABLE jednostki
(
    nr serial NOT NULL,
    jednostka varchar(30) NOT NULL
);
CREATE TABLE nazwy_towarow
(
    nr serial NOT NULL,
    nazwa varchar(30) NOT NULL
);
CREATE TABLE stany_mag
(
    nr serial NOT NULL,
    nazwa varchar(30) NOT NULL,
    ilosc varchar(50) NOT NULL,
    jednostka varchar(30) NOT NULL,
    cena varchar(30) NOT NULL
);
INSERT INTO jednostki (jednostka)VALUES('KG'),('M'),('SZTUK'),('LITROW');
INSERT INTO nazwy_towarow (nazwa)VALUES('produkt1'),('produkt2'),('produkt3'),('produkt4');
INSERT INTO stany_mag (nazwa,ilosc,jednosta,cena)VALUES
((SELECT nr FROM nazwy_towarow WHERE nazwa='produkt1'),1,(SELECT nr FROM jednostki WHERE jednostka='KG'),100),
((SELECT nr FROM nazwy_towarow WHERE nazwa='produkt2'),2,(SELECT nr FROM jednostki WHERE jednostka='M'),200),
((SELECT nr FROM nazwy_towarow WHERE nazwa='produkt3'),3,(SELECT nr FROM jednostki WHERE jednostka='SZTUK'),300),
((SELECT nr FROM nazwy_towarow WHERE nazwa='produkt4'),4,(SELECT nr FROM jednostki WHERE jednostka='LITROW'),400);

Po wysłaniu zapytania mam:

BŁĄD:  tabela "stany_mag" nie istnieje

********** Błąd **********

BŁĄD: tabela "stany_mag" nie istnieje
Stan SQL: 42P01

2

Odp: Pomoc z tworzeniem pierwszej bazy danych

Po wysłaniu zapytania mam:

BŁĄD:  tabela "stany_mag" nie istnieje

Dobrze masz, jeżeli dopiero tworzysz bazę to co chcesz usuwać??

drop table if exists stany_mag;

3

Odp: Pomoc z tworzeniem pierwszej bazy danych

@adamleon: Dobrze robi, przy rekreowaniu struktury tabel od razu ma je wyczyszczone (jednakże IF EXISTS jest kluczowe), sam tak często robię.

@ar4: Pierwsze co rzuca mnie się w oczy to brak kluczy głównych (primary key), zdecydowanie powinieneś rozważyć ich dodanie, nota bene jeżeli kolumnę określisz jako  nr serial Primary Key, to Not Null nie będzie już potrzebne (i.e. sam to klucz gwarantuje). Kolejna rzecz to klucze obce i więzy integralności np. jednostka z tabeli stany_mag mogłaby być kluczem obcym do nr z tabeli jednostka itd. (swoją drogą kolumnę jednostka możesz nazwać jako jednostka_nr żeby wyraźniej podkreślić, że chodzi o takie odniesienie do numeru).

Przy INSERT INTO stany_mag (nazwa,ilosc,jednosta,cena)VALUES machnąłeś się o literówkę, powinno jednostka zamiast jednosta.

Trochę dziwny jest ten ostatni insert (z tymi selectami), ale jeżeli tak miała być intencja to OK, zauważ tylko, że skoro kolumna jednostka w tabeli jednostki nie została określona jako UNIQUE, to możesz natrafić na problem przy kilku takich samych np: dodasz kolejne

INSERT INTO jednostki (jednostka)VALUES('KG');

to przy takim dodawaniu otrzymasz komunikat błędu:

INSERT INTO stany_mag (nazwa,ilosc,jednostka,cena) VALUES  ((SELECT nr FROM nazwy_towarow WHERE nazwa='produkt1'),1,(SELECT nr FROM jednostki WHERE jednostka='KG'),100);
ERROR:  more than one row returned by a subquery used as an expression

Ostatnio edytowany przez gszpetkowski (2012-01-12 16:13:49)

4

Odp: Pomoc z tworzeniem pierwszej bazy danych

gszpetkowski masz rację

"INSERT INTO stany_mag (nazwa,ilosc,jednostka,cena) VALUES  ((SELECT nr FROM nazwy_towarow WHERE nazwa='produkt1'),1,(SELECT nr FROM jednostki WHERE jednostka='KG'),100);
ERROR:  more than one row returned by a subquery used as an expression"

Też miałem ten problem właśnie przez brak k w "jednosta"

"Przy INSERT INTO stany_mag (nazwa,ilosc,jednosta,cena)VALUES machnąłeś się o literówkę, powinno jednostka zamiast jednosta."

Po poprawieniu właśnie tego k w jednostka wystąpił ten błąd "ERROR:  more than one row returned by a subquery used as an expression""po wykonaniu dalej zapytania po błędzie.
Ale kiedy najpierw się poprawi "jednostka" i wykona się wszystko od nowa łącznie z usunięciem tabel błąd nie występuje

Chyba nie zagmatwałem :-)