grzechoo
5.01.2005, 12:06:51
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;
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
5.01.2005, 13:14:23
To może spróbuj jeśli jesteś tak jak piszesz początkujący po prostu:
CREATE TABLE uzytkownicy (id INT NOT NULL PRIMARY KEY, login CHAR(15), haslo CHAR(45))
grzechoo
5.01.2005, 13:51:25
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));
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
5.01.2005, 16:56:09
dzieki Ci serdeczne, bede probowal jak cos to bede pisal i pytal
pozdrawiam