Permalänk
Medlem

MYSQL-problem, hjälp???

Jag får inte det jädrans skript att fungera, vad är felet?

DROP TABLE if exists Bildelar;
DROP TABLE if exists Kund;
DROP TABLE if exists Lagersaldo;
DROP TABLE if exists Ordern;

CREATE TABLE Bildelar
(

marke VARCHAR(255) NOT NULL,
modell VARCHAR(255) NOT NULL,
arsmodell VARCHAR(255) NOT NULL,
artikel VARCHAR(255),
beteckning VARCHAR(255) NOT NULL,
bildel VARCHAR(255) NOT NULL,
pris INTEGER(5) NOT NULL,
PRIMARY KEY (marke, modell, arsmodell, artikel)
)TYPE=InnoDB;

CREATE TABLE Kund
(

namn CHAR(255) NOT NULL,

personnr VARCHAR(255) NOT NULL,
adress VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,

kundnr VARCHAR(255) NOT NULL,

password VARCHAR(255) NOT NULL,

PRIMARY KEY (kundnr)
)TYPE=InnoDB;
CREATE TABLE Lagersaldo
(

artikel VARCHAR(255),

antal INTEGER(5) NOT NULL,

PRIMARY KEY (artikel, antal),
FOREIGN KEY (artikel) REFERENCES Bildelar (artikel)
ON UPDATE CASCADE ON DELETE NO ACTION
)TYPE=InnoDB;

CREATE TABLE Ordern
(

ordernr VARCHAR(255) NOT NULL,
kundnr VARCHAR(255) NOT NULL,
artikel VARCHAR(255),
antal INTEGER(5) NOT NULL,

PRIMARY KEY (ordernr),

FOREIGN KEY (kundnr) REFERENCES Kund (kundnr)
ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (artikel) REFERENCES Bildelar (artikel)
ON UPDATE CASCADE ON DELETE NO ACTION
)TYPE=InnoDB;

Det stora problemet är kolumnen artikel som inte fungerar att sätta som främmande nyckel någonstans.
Nu är det så att jag inte är hemma, men om jag inte minns fel så är felmeddelandet något i stil med "MySQL ERROR 1005: Can't create table (errno: 150))" När det gäller tabellerna Lagersaldo samt Ordern (där artikel finns)
Kan nämnas att jag även testat att indexera artikel i Ordern & Lagersaldo, men icke!

Vad f*n gör jag för fel?

Permalänk
Medlem

Varför har du fyra(!) primary keys på "bildelar"?

Det är väl bara artikel som ska vara primary?
Prova det så borde det fungera.
Tänk även på att inte kalla olika kolumner för samma namn i en databas.

DROP TABLE if exists ordern;
DROP TABLE if exists lagersaldo;
DROP TABLE if exists kund;
DROP TABLE if exists bildelar;

CREATE TABLE Bildelar
(

marke VARCHAR(255) NOT NULL,
modell VARCHAR(255) NOT NULL,
arsmodell VARCHAR(255) NOT NULL,
artikel VARCHAR(255),
beteckning VARCHAR(255) NOT NULL,
bildel VARCHAR(255) NOT NULL,
pris INTEGER(5) NOT NULL,
PRIMARY KEY (artikel)
)TYPE=InnoDB;

CREATE TABLE Kund
(

namn CHAR(255) NOT NULL,

personnr VARCHAR(255) NOT NULL,
adress VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,

kundnr VARCHAR(255) NOT NULL,

password VARCHAR(255) NOT NULL,

PRIMARY KEY (kundnr)
)TYPE=InnoDB;
CREATE TABLE Lagersaldo
(

artikel VARCHAR(255),

antal INTEGER(5) NOT NULL,

PRIMARY KEY (artikel),
FOREIGN KEY (artikel) REFERENCES Bildelar (artikel)
ON UPDATE CASCADE ON DELETE NO ACTION
)TYPE=InnoDB;

CREATE TABLE Ordern
(

ordernr VARCHAR(255) NOT NULL,
kundnr VARCHAR(255) NOT NULL,
artikel VARCHAR(255),
antal INTEGER(5) NOT NULL,

PRIMARY KEY (ordernr),

FOREIGN KEY (kundnr) REFERENCES Kund (kundnr)
ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (artikel) REFERENCES Bildelar (artikel)
ON UPDATE CASCADE ON DELETE NO ACTION
)TYPE=InnoDB;

Där har du en som fungerar, dock ligger de dubbla namnen kvar exempelvis artikel som finns i flera tabeller.

Visa signatur

Macbook pro 13" :)

Permalänk
Medlem

Tack så hemskt mycket, ska testa mig av det rätta skriptet...

Har bara en fråga, varför är det dåligt att ha just artikel i flera tabeller? har det med ren förvirring att göra eller? Eller är det något "farligt" som kan komma att spela roll?
Har du isåfall några förslag? Allt uppskattas!

Permalänk
Medlem

Det är både och.. Som du säger så förvillar man sig själv väldigt lätt och det kan bli ett helvete om databasen växer. Därför är det viktigt att man gör rätt från början och har det väldigt strikt uppradat. Det är också en "lag" om man ska använda sig av en korrekt relationsdatabas som ovan är.

Ett bra exempel kan vara ditt artikel som istället kan heta bildelar_artikel i tabellen bildelar, lagersaldo_artikel i lagersaldo osv.. Väldigt enkelt för att lätt kunna se vilken artikel det är man jobbar med.

Tänk även på att bara ha en primary key i varje tabell.

Sen kan du också sätta auto_increment på alla dina primary keys då det passar bra i just detta fallet och spar mycket tid.

Visa signatur

Macbook pro 13" :)

Permalänk
Medlem

Sjysst med tips, uppskattas alltid!

Jag fick inte auto_increment att fungera på mina PK..har det med att de inte är INTs?

Har en fråga också...hur får jag in mina s.k. orderinfo i Ordern-tabellen? Jag får ett köp genomfört, den drar bort från antal i lagersaldot etc men inget händer i Ordern...

länken till "sidan" är medieprod.ts.mah.se/~tf052796/test/index.php

Permalänk
Medlem

Ja det är sant att det inte fungerar på dina PK då de inte är INT, my bad

Du borde skapa en till tabell som heter artikel som innehåller artikel_id och artikel_namn, Primary key artikel_id. Sen sätter du alla dina artikel kolumner som foreign key till den tabellen så kan du enkelt ändra namn på en artikel på ett ställe istället för i alla dina kolumner.

Vad är det som ska hända i ordertabellen när du ändrar nått i lagersaldo?

Visa signatur

Macbook pro 13" :)