[MySQL] Nie tworzy sie tabela - nie dzialaja klucze obce?

0

Witam.

Mam w skrypcie tables.sql tak zdefiniowane tabele:

create table tab_user
(
        user_id                 int AUTO_INCREMENT NOT NULL,-- PRIMARY KEY,
        nick                     varchar(10) NOT NULL, -- to tez jako primary key?
        avatar                  varchar(14),
        skad                    varchar(10),
        posty                   integer NOT NULL,
        data_dolaczenia	  date NOT NULL,
        imie                     varchar(12),
        nazwisko                varchar(12),
        moderator               tinyint(1) default false,

        PRIMARY KEY(user_id, nick), -- ??????????????
        INDEX(nick)
) TYPE = InnoDB;

create table tab_post
(
        post_id                       int AUTO_INCREMENT NOT NULL PRIMARY KEY,
        nick                           varchar(10) NOT NULL,
        posty                         integer NOT NULL, -- ilosc postow autora posta
        data_posta                    date NOT NULL,
        tresc_posta_sciezka           varchar(20) primary key, -- sciezka do pliku z trescia posta

        -- CONSTRAINT tab_post_nick_fk FOREIGN KEY (nick) REFERENCES tab_user(nick),
        CONSTRAINT tab_post_posty_fk FOREIGN KEY (posty) REFERENCES tab_user(posty), -- ON UPDATE CASCADE
        INDEX(data_posta)
) TYPE = InnoDB;

Po wpisaniu polecenia source d:/tables.sql; dodaje mi do bazy danych tabele tab_user natomiast przy drugiej sie wysypuje, wypisujac nastepujacy komunikat:

ERROR 1005 (HY000): Can't create table '.\forum\tab_post.frm' (errno: 150)

Jezeli natomiast zapisze ta druga tabele tak:

create table tab_post
(
        post_id                       int AUTO_INCREMENT NOT NULL PRIMARY KEY,
        nick                           varchar(10) NOT NULL,
        posty                         integer NOT NULL, -- ilosc postow autora posta
        data_posta                    date NOT NULL,
        tresc_posta_sciezka           varchar(20) primary key, -- sciezka do pliku z trescia posta

        CONSTRAINT tab_post_nick_fk FOREIGN KEY (nick) REFERENCES tab_user(nick),
        -- CONSTRAINT tab_post_posty_fk FOREIGN KEY (posty) REFERENCES tab_user(posty), -- ON UPDATE CASCADE
        INDEX(data_posta)
) TYPE = InnoDB;

to wszystko dziala bez zarzutu. Jednak potrzebowalbym oba te klucze glowne miec w tej tabeli, a przynajmniej ten drugi, wiec co jest nie tak i jak to poprawic?

Kolejna sprawa przedstawia sie nastepujaco:
Jako, ze to fragment bazy danych forum(programistycznego - ale to w sumie niewazne jakiego) to uzytkownicy maja licznik ilosci postow, ktore napisali. Ta ilosc postow jest tez w drugiej tabeli, ktora zamiescilem wiec: jak zrobic, zeby przy wypelnianiu tabeli tab_post, licznik w tabeli tab_user sie automatycznie zwiekszal? Da sie tak w ogóle?<zakladamy ze="ze" posty="posty" nie="nie" beda="beda" kasowane="kasowane">.

Ps. Sory za ewentualne zagmatwanie ale mecze sie z tym pare ladnych godzin i nic a do tego juz tak jakby pozno.

Pozdrawiam.

0
  1. wypadało by podać wersję mysqla
  2. wypadało by dokumentacje poczytać http://dev.mysql.com/doc/refman/5.0/en/create-table.html
  3. co to jest "tresc_posta_sciezka varchar(20) primary key" i po co
  4. po co posty w tab_post
  5. poczytaj co to i do czego unique index
  6. nick varchar(10) to tak troszkę mało wg mnie
0
  1. dokladna wersja to: 4.1.21-max
  2. hmmm... dokumentacje czytalem a raczej wyszukiwalem co wazniejsze/przydatniejsze rzeczy wiec moze cos pominalem...
  3. ogolnie to ma w tym byc przechowywana sciezka do pliku, w ktorym znajduje sie tresc posta danego usera, co do tego primary key to sam nie wiem jak mi sie tam zakradl<pomylka moja lub pozostalosc z poprzedniej wersji bazy, ale i tak nie ma to wplywu na to, ze tabela nie chce sie utworzyc>
  4. w sumie to nie wiem po co ale wydawalo mi sie to sensowne chocby ze wzgledu na wlasnie ten drugi problem<gdyby jednak nie dalo sie tak zrobic jak pisalem w pierwszym poscie czyli zeby automatycznie zwiekszalo licznik postow, to w sumie niepotrzebne to i problemu by zadnego nie bylo z dzialaniem bazy>
  5. ok poczytam
  6. varchar to jak wiadomo ciag znakow o zmiennej dlugosci a varchar(10) to taki na ktory przeznaczamy minimum 10 znakow<chyba, ze cos zle zinterpretowalem> wiec wg mnie moze byc<ty masz w nicku 7 znakow ;-)>

Pozdrawiam.

0
Joker napisał(a)
  1. hmmm... dokumentacje czytalem a raczej wyszukiwalem co wazniejsze/przydatniejsze rzeczy wiec moze cos pominalem...

http://dev.mysql.com/doc/refman/4.1/en/innodb-foreign-key-constraints.html
a dokładniej
In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Starting with MySQL 4.1.2, such an index is created on the referencing table automatically if it does not exist.

  1. ogolnie to ma w tym byc przechowywana sciezka do pliku, w ktorym znajduje sie tresc posta danego usera,

no to masz bazę a treść posta przechowujesz w pliku????

  1. w sumie to nie wiem po co ale wydawalo mi sie to sensowne chocby ze wzgledu na wlasnie ten drugi problem<gdyby jednak nie dalo sie tak zrobic jak pisalem w pierwszym poscie czyli zeby automatycznie zwiekszalo licznik postow, to w sumie niepotrzebne to i problemu by zadnego nie bylo z dzialaniem bazy>

automatycznie się nie da (ani trigger ani stored proc w tych wersjach nie ma), BTW jak zrobisz SELECT COUNT(*) FROM tabela_z_postami WHERE user_id = id to dostaniesz liczbę postów danego usera. Przy indexach do pewnego momentu będzie chodzić OK, później będzie coraz wolniejsze

  1. varchar to jak wiadomo ciag znakow o zmiennej dlugosci a varchar(10) to taki na ktory przeznaczamy minimum 10 znakow<chyba, ze cos zle zinterpretowalem> wiec wg mnie moze byc<ty masz w nicku 7 znakow ;-)>

ano źle - VARCHAR(10) to pole, gdzie możesz mieć 10 znaków ale maksymalnie i patrząc na nicki, choćby nawet na 4p to będzie to zdecydowanie za mało

0

Teraz wszystkie tabele sie dodaja, pozostaje tylko dopracowac cala baze.

Dzieki za pomoc.

Ps. Tresc posta miala byc w pliku bo wielkosc pliku jest ograniczona jedynie przez pojemnosc dysku, w przeciwienstwie do pol bazy danych, ktore maja nalozone odgornie ograniczenia - pomysle jeszcze nad tym w czym przechowywac tresc posta, ale chwilowo przerobilem to tak, zeby jednak tresc byla trzymana w bazie a nie w pliku, ale to z pewnych powiedzmy, ze testowych powodow bo kazde rozwiazanie ma swoje wady i zalety.

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1