Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyzwalacz tworzący tabelę
Forum PHP.pl > Forum > Bazy danych > MySQL
juna8001
Witam.
Tworzymy z kolegą prostą grę przeglądarkową. Niestety, w kwestii SQL jeszcze raczkujemy. Chcę stworzyć wyzwalacz, który po dodaniu rekordu do tabeli "games" tworzy tabelę o nazwie "game.ID.players", gdzie w miejscu ID ma pojawić się zawartość pola "id" z tabeli "games". I tu pojawia się problem: w jaki sposób to napisać, żeby nazwa nowej tabeli zawierała id nowego rekordu?
kartin
Pomysł tworzenia osobnej tabeli dla każdego użytkownika nie jest najlepszy, wszystko można trzymać w jednej tabeli. Nazwę tabeli możecie sobie stworzyć przy pomocy CONCAT() albo lepiej CONCAT_WS().
Jednak waszym problemem jest to, że stworzenie tabeli wymaga zatwierdzenia transakcji, co nie jest dozwolone w MySQL w funkcjach składowanych i wyzwalaczach. Czyli nie można tworzyć tabel w ten sposób.
Cytat
Restrictions for Stored Functions
The following additional statements or operations are not permitted within stored functions. They are permitted within stored procedures, except stored procedures that are invoked from within a stored function or trigger. (...)
  • Statements that perform explicit or implicit commit or rollback. (...)
juna8001
Tabela miałaby być tworzona dla każdej rozgrywki, a nie dla każdego gracza.
Jeśli dobrze rozumiem, nie da się stworzyć tabeli poprzez wyzwalacz. W takim razie, jeśli chcę, by dla każdej nowej rozgrywki była tworzona osobna tabela, muszę użyć skryptu php, tak?
kartin
Tak, trzeba tworzyć przez osobne zapytanie. Jednak cały czas jest to zły pomysł. Wystarczy stworzyć jedną tabelę gamePlayers i dodać w niej osobną kolumnę z ID rozgrywki.

juna8001
Dzięki za pomoc. W naszej grze gracze będą mogli brać udział w kilku meczach na raz i tabela, którą chcę tworzyć dla każdej rozgrywki ma zawierać listę slotów dla graczy oraz do zajętych slotów przypisanych graczy. Mógłbym to co prawda zrobić w jednej tabeli, lecz miałaby ona więcej kolumn i przy wyszukiwaniu danych dotyczących tylko jednej rozgrywki musiałbym przeszukiwać całą dużą tabelę, zamiast szukać danych w osobnej, mniejszej tabeli. W tym przypadku wydaje mi się to najbardziej optymalne i wygodne rozwiązanie.
DarkAbso
Jedna tabela, ewentualnie kilka tabel z odpowiednimi relacjami. Powtarzanie danych w tabelach według Twojego pomysłu, kłóci się z założeniami relacyjnego modelu bazy danych.
juna8001
Mam tabelę z listą graczy i tabelę z listą rozgrywek. Powinna je łączyć relacja wiele do wielu, lecz wtedy miałbym dodatkowo jedną, obszerną tabelę. W tabeli tej często muszę dokonywać zmian (jeśli gracz dołączy do rozgrywki lub ją opuści). Wyszukiwanie pojedyńczego rekordu w takiej tabeli byłoby niezbyt optymalne.
W przypadku tworzenia osobnej tabeli dla każdej rozgrywki, informacje wyszukuje zawsze w niezbyt obszernej tabeli.
Poza tym, ze względu na to, że każda rozgrywka jest całkowicie niezależna od innych, tak samo mam zamiar dla każdej rozgrywki tworzyć tabelę z listą jednostek i budynków występujących w danej rozgrywce. Trzymanie ich w jednej tabeli byłoby niewygodne, szczególnie, że nie mam potrzeby porównywać danych z zupełnie różnych rozgrywek.
Może i kłóci się to z założeniami relacyjnej bazy danych, lecz wydaje mi się znacznie rozsądniejsze.
DarkAbso
Ile będziesz miał w tej tabeli wpisów? 10 tysięcy, 20 tysięcy czy może 100 tysięcy? Dla baz danych są to żadne ilości. Zrobisz jak uważasz, ja tylko wyraziłem swoją opinię. Co do wyzwalaczy to mogę tylko zasugerować, iż jak nie musisz ich używać to tego nie rób.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.