Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Potrzebna Modyfikacja Tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
Czatowicz
Jestem nowy w MySQL'u więc napewno mój kod ma pełno błędów, może go ktoś poprawić?

id -> id uzytkownika, nie powtarzalne
numer -> numer nie powtarzalny.
ban -> cyfra 0 lub 1, (chyba) nie moze sie powtarzac ale niewiem czy to nie zepsuje jak inni by byli zablokowani
online -> cyfra 0 lub 1
ranga -> cyfry do 10.000 od 0, moze byc puste jedyne
nick -> do 32 znakow [A-Z][a-z][0-9],
timeregister -> czas rejestracji dzieki funkcji SQL NOW().

  1. CREATE TABLE users
  2. (
  3. id TINYINT PRIMARY KEY AUTOINCREMENT NOT NULL,
  4. numer TINYINT PRIMARY KEY NOT NULL,
  5. ban TINYINT(2) PRIMARY KEY NOT NULL,
  6. online TINYINT(2) NOT NULL,
  7. ranga TINYINT(2),
  8. nick VARCHAR(32) PRIMARY KEY NOT NULL,
  9. timeregister DATETIME NOT NULL
  10. );
  11. ALTER TABLE `users`
  12. DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci
Pyton_000
id ok, ustaw tylko jako INT
numer klucz unikalny
ban bez klucza
online ok
ranga int
nick ok, bez klucza
time ok

Czatowicz
Cytat(Pyton_000 @ 2.02.2014, 16:01:33 ) *
id ok, ustaw tylko jako INT
numer klucz unikalny
ban bez klucza
online ok
ranga int
nick ok, bez klucza
time ok


gdzieś czytałem (na forum.php.pl) że INT bierze 4bajty a TINYINT 1, robi to jakas roznice?

edit: Dziękuje za pomoc smile.gif

edit2: Zrobiłem tak jak było kazane, mam nadzieje że już dobrze

  1. CREATE TABLE users
  2. (
  3. id INT PRIMARY KEY AUTOINCREMENT NOT NULL,
  4. numer TINYINT PRIMARY KEY NOT NULL,
  5. ban TINYINT(2) NOT NULL,
  6. online TINYINT(2) NOT NULL,
  7. ranga INT(2),
  8. nick VARCHAR(32) NOT NULL,
  9. timeregister DATETIME NOT NULL
  10. );
  11. ALTER TABLE `users`
  12. DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci


ps. nick mial byc tez nie powtarzalny, dodac PRIMARY KEY?
sazian
a spróbuj dodać drugi PRIMARY KEY i poznasz odpowiedź wink.gif

zobacz do dokumentacji to będziesz wiedział dlaczego int http://dev.mysql.com/doc/refman/5.0/en/integer-types.html
te kilka bajtów na rekord nie zrobi żadnej różnicy
Czatowicz
Cytat(sazian @ 2.02.2014, 22:35:52 ) *
a spróbuj dodać drugi PRIMARY KEY i poznasz odpowiedź wink.gif

zobacz do dokumentacji to będziesz wiedział dlaczego int http://dev.mysql.com/doc/refman/5.0/en/integer-types.html
te kilka bajtów na rekord nie zrobi żadnej różnicy


edit: uu, niewiedziałem że tinyint ma taki mały limit...
edit2: to "SMAILLINT" chyba będzie lepsze niż "INT" bo dane do 10.000 znaków.
ps. kod podczas dodania wywalil bledy, musialem wrecz przeciwnie skasowac primary key zeby byl tylko jeden i do tego mialbyc tam gdzie auto_increment.. glupie troche
nospor
Nie ma cyfry 10000. Jest co najwyzej liczba 10000.
INT to za duzy zakres dla 10000. Dostales linka do typow, wiec wybierz wlasciwy.

I co to za typy z (2)
Kolejna lektura
http://nospor.pl/int11-kontra-int.html

Cytat
kod podczas dodania wywalil bledy, musialem wrecz przeciwnie skasowac primary key zeby byl tylko jeden i do tego mialbyc tam gdzie auto_increment.. glupie troche
No wlasnie..... moze byc tylko jeden PRIMARY.... to nie glupota, to logiczna madrosc.
Czatowicz
Cytat(nospor @ 2.02.2014, 22:41:10 ) *
I co to za typy z (2)
Kolejna lektura
http://nospor.pl/int11-kontra-int.html


przeczytałem lekture, wnioski mam takie że inni programisci a konkretniej początkujący (jak ja) używaja z braku wiedzy np.
INT(5) który wg. ich "Oznacza liczby 5-cio cyfrowe" ja to troche inaczej widziałem,
a konkretniej że TINYINT(2) przyjmie wartosci 1, 01, ale nie 001. (do 2 cyfr)
a jeśli o to nie chodzi to co robi (?...?) , ? bo nie znlazłem lub nie czytam z uwagą.
nospor
(2) ma znaczenie gdy uzywasz ZEROFILL. Wyraznie o tym napisalem w arcie, ktory jest pisany po polsku.

Cytat
Liczby w nawiasach przy typach z rodziny INT służą tylko i wyłącznie w przypadku, gdy używamy ZEROFILL....
Tak więc zapis INT(1) nie ogranicza nas w żaden sposób do maksymalnie liczby 9 i w żaden sposób taka kolumna nie będzie zajmowała jednego bajta tylko nadal 4 jak każdy INT. Jeśli chcemy ograniczyć nasze pole do jednego bajta to poprostu użyjmy TINYINT. Jeśli chcemy ograniczyć kolumnę do 50tys (a konkretnie 65535) to używamy nie INT(5) tylko SMALLINT.
Pyton_000
Kolejna mądrość:
Jak nie trzymasz liczb ujemnych to używaj Unsigner, dostajesz 2x większy zakres

Unikalność załatwiasz poprzez klucz Unique lub nadanie Primary Key na kilka pól (co przydaje się najczęściej w tabelach do powiązań n:M lub tam gdzie wyszukuje się po obu kolumnach)

Kolejna ważna uwaga. Jeżeli użyjesz Unsigned dla kolumny z PK to podczas robienia relacji poprzez Foreign Keys każde pole dowiązywane musi być z Unsigned inaczej się wysypie.
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.