Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: tworzenie tabeli - pomożcie prosze
Forum PHP.pl > Forum > Bazy danych > MySQL
grzechoo
witam wszystkich, dopierozaczynam przygode z mysql
chce utworzyc tabele hasla polaczona z inna tabela klienci, ale wyskakuje mi blad
ERROR 1005:Can't create table.......<errno:m 150>
czy ktos wie co mam zle?? pomozcie prosze

create table hasla (login varchar(15) NOT NULL primary key,
haslo text NOT NULL,
CONSTRAINT warunek1 FOREIGN KEY (login) REFERENCES klienci(login) ) TYPE=InnoDB;
mhs
Witaj,

Przede wszystkim pokaż cały kod, którym tworzysz strukturę bazy danych.

Moje uwagi w tej chwili są następujące:
1) być może tworzysz relację do nieistniejącej tabeli
2) wybor pola text na haslo nie jest najlepszym rozwiazaniem -> najlepiej zastosowac pole typu CHAR (a prawdopodobnie VARCHAR) o dlugosci 32 znakow gdzie bedzie przechowywal haslo poddane dzialaniu funkcji MD5
3) IMHO zastanawiałbym się też czy nie utworzyć klucz sztuczny typu int zamiast loginu jako klucza głównego -> ale to jest kwestia dyskusyjna (osobiście preferuję takie rozwiązanie)

Pamiętej, że klucze obce musisz tworzyć na pola indeksowane.

Więcej podpowiem Ci jak pokażesz strukturę bazy danych.

Pozdrawiam
crash
To może spróbuj jeśli jesteś tak jak piszesz początkujący po prostu:
  1. CREATE TABLE uzytkownicy (id INT NOT NULL PRIMARY KEY, login CHAR(15), haslo CHAR(45))
grzechoo
chce zrobic takie tabele i polaczenia miedzy nimi.
w sumie to juz je zrobilem jakbyscie mogli to sprawdzcie i nap[iszcie czy to sie nadaje, z gory dzieki
-----------------------------------------------------------
-----------------------------------------------------------
create table hasla (login varchar(15) NOT NULL,
haslo text NOT NULL,
PRIMARY KEY (login),
CONSTRAINT 1_1 FOREIGN KEY (login) REFERENCES kontrahenci (login));

___________________________________________
create table kontrahenci (
login varchar(15) NOT NULL,
idklienta int NOT NULL PRIMARY KEY AUTO_INCREMENT,
nazwa varchar(20) NOT NULL,
adres varchar(20) NOT NULL,
miasto varchar(20) NOT NULL,
kod_pocztowy int(5) NOT NULL default '0',
regon int NOT NULL default '00000',
kraj text,
CONSTRAINT 1_2 FOREIGN KEY (idklienta) REFERENCES zamowienie(idklienta));
------------------------------------------------------
create table zamowienie (
idzamowienia int NOT NULL PRIMARY KEY AUTO_INCREMENT,
idklienta int NOT NULL,
idtowaru int NOT NULL,
data_zamowienia date NOT NULL default '0',
sposob_platnosci enum('gotowka','czek','raty','odroczony_termin'),
idstatus int NOT NULL,
CONSTRAINT 1_2 FOREIGN KEY (idtowaru) REFERENCES towary(idtowaru));

------------------------------------------------------

create table status (
idstatus int NOT NULL PRIMARY KEY AUTO_INCREMENT,
nazwa enum('zrealizowane','realizowane','niezrealizowane','nieznane'),
CONSTRAINT 1_4 FOREIGN KEY (idstatus) REFERENCES zamowienie(idstatus));

------------------------------------------------------

create table opis_zamowienia (
idzamowienia int NOT NULL PRIMARY KEY,
idtowaru int NOT NULL,
cena int NOT NULL default '0',
ilosc int NOT NULL default'0',
rabat int NOT NULL default'0',
CONSTRAINT 1_5 FOREIGN KEY (idzamowienia) REFERENCES zamowienia(idzamowienia));
--------------------------------------------------

create table towary (
idtowaru int NOT NULL PRIMARY KEY AUTO_INCREMENT,
iddostawcy int NOT NULL,
nazwa varchar(20) NOT NULL,
cena int NOT NULL default '0',
ilosc int NOT NULL default'0',
data_przyjecia date NOT NULL default '0',
idrodzaj int NOT NULL,
CONSTRAINT 1_6 FOREIGN KEY (iddostawcy) REFERENCES dostawca(iddostawcy));

-----------------------------------------------------
create table dostawca (
iddostawcy int NOT NULL PRIMARY KEY AUTO_INCREMENT,
nazwa varchar(20) NOT NULL,
adres varchar(20) NOT NULL,
miasto varchar(20) NOT NULL,
kod_pocztowy int(5) NOT NULL default '0',
regon int NOT NULL default '00000',
kraj text,
);

---------------------------------------------------
create table kategoria (
idrodzaj int NOT NULL PRIMARY KEY AUTO_INCREMENT,
nazwa varchar(20) NOT NULL,

CONSTRAINT 1_6 FOREIGN KEY (idrodzaj) REFERENCES towary(idrodzaj));
mhs
kurcze.. musze jeszcze raz napisac odpowiedz gdyz cos sie podzialo z serwerem i nie udalo mi sie wyslac opowiedzi....

raz jeszcze...

przede wszystkim widze, ze usunales (przynajmniej z tabeli hasla) typ definiowanej tabeli -> jezeli uzywasz mysql w wersji 4.0.xx lub starszej oznacza to ze definiujesz tabele typu MyISAM ktora to nie obsluguje mozliwosci zakladania kluczy obcych (chociaz sama tabela zostanie zdefiniowana prawidlowo)

w zwiazku z tym w projekcie bazy danych bez sensu jest definiowanie kluczy obcych, w chwili obecnej masz 2 wyjscia:
- albo zapominasz o definiowaniu kluczy obcych i usuwasz z projektu definicje kluczy ----> korzystasz wowczas z typu MyISAM
- albo przykladasz sie porzadnie do projektu bazy danych, korzystasz z InnoDB i tworzysz relacje pomiedzy tabelami...

jezeli jednak chcesz zrobic to drugie to musisz spelnic kilka warunkow:
- tabele zdefiniowane musza byc po kolei (jezeli beda w takiej kolejnosci jak teraz beda pokazywac Ci sie takie same komunikaty jak wczesniej)
- na klucze obce musisz pozakladac indeksy gdyz w przeciwnym wypadku mysql bedzie wyrzucal bledy

teraz kilka slow o projekcie bazy danych:
1) IMHO jest do poprawy przebudowy - spawdziles czy to co wrzuciles do swojej wiadomosci wykonuje sie prawidlo? nie sadze gdyz w tabeli dostawca masz blad:, po definicji pola kraj typu text (swoja droga troche bez sensu) nie moze byc znaku przecinka
2) wg mnie wybor typow niektorych pol jest bez sensu: np. dla pola kraj po co Ci pole typu text? takich przykladow moge wymienic wiecej np:
nazwa varchar(20) NOT NULL,
adres varchar(20) NOT NULL,
miasto varchar(20) NOT NULL,

od reki moge wymienic Ci klka firm gdzie nazwa ich jest wieksza od 20 znakow, podobnie jest z adresem czy tez w koncu z nazwami miast... spokojnie mozna znalezc przyklady gdzie w starciu z rzeczywistoscia Twoj projekt bazy danyc polegnie

bardzo podobna sytuacja jest przy kontrahenrach

mam takie wrazenie ze oszczedzasz tam gdzie nie powinienes a tam gdzie moglbys tego nie robisz (wspomniane juz wczesniej haslo czy w koncu tez wspomniana definicja pola kraj)

3) do tej pory zastanawiam sie po co Ci definicja tabeli hasla - czy po to by kontrahenci mogli sie logowac gdzies tam? czy w takim bardz razie nie przenies tego do tabeli kontrahenci?

4) nazwy tabel: zamowienie, dostawca, kategoria powinny kolejno byc: zamowienia, dostawcy, kategorie - moze jest to juz jakis niuans ale w kazdej ksiazce o projektowaniu baz danych znajdziesz kilka uwag do odpowiedniego nadawania nazw tabel czy kolumn

w chwili obecnej to z grubsza to co rzucilo mi sie do oczu... zastanowie sie czy na pewno chcesz wykorzystac mozliwosc definiowania relacji pomiedzy tymi tabelami w mysql'u -> jezeli tak to zrob to porzadnie, no i w koncu zastanow sie nad projektem bazy danych...

w razie watpliwosci i pytan pisz

pozdrawiam
grzechoo
dzieki Ci serdeczne, bede probowal jak cos to bede pisal i pytal
pozdrawiam
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.