Vinnaren i pepparkakshustävlingen!
2013-02-04, 13:35
  #1
Medlem
Hej,

Försöker skapa två tabeller: members2 och texter2. För att sätta in ett värde i texter2 krävs att 'addedby' ska återfinnas som 'id' i members2.

Med andra ord (om jag fattat det rätt) så ska addedby vara en foreign key med references till mebmers2(id)

Kod:
CREATE TABLE members2(
	id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
	username varchar(128) NOT NULL UNIQUE,
	password varchar(128) NOT NULL,
	signupdate datetime NOT NULL,
	lastlogin datetime,
	lastPicName varchar(128),
	profilePic varchar(128) NOT NULL,
	accounttype enum('a','b','c') NOT NULL,
	emailactivated enum('0','1') NOT NULL DEFAULT '0',
	approvedbyuser enum('0','1') NOT NULL DEFAULT '0',
	approvedbyadmin enum('0','1') NOT NULL DEFAULT '0'
);

create TABLE texter2(
	text_id INT PRIMARY KEY AUTO_INCREMENT,
	rubrik varchar(128),
	text text(10000),
	addedby int NOT NULL FOREIGN KEY addedby REFERENCES members2(id)
	
);

Jag för följande fel: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOREIGN KEY addedby REFERENCES members2(id)

)' at line 5
Citera
2013-02-04, 13:47
  #2
Medlem
darcodes avatar
Testa

Kod:
create TABLE texter2(
	text_id INT PRIMARY KEY AUTO_INCREMENT,
	rubrik varchar(128),
	text text(10000),
	addedby int NOT NULL FOREIGN KEY REFERENCES members2(id)
	
);

eller om du vill ha en namngiven foreign key constraint:

Kod:
create TABLE texter2(
	text_id INT PRIMARY KEY AUTO_INCREMENT,
	rubrik varchar(128),
	text text(10000),
	addedby int NOT NULL,

	CONSTRAINT fk_addedby FOREIGN KEY (addedby)
	REFERENCES members2(id)
	
);
Citera
2013-02-04, 14:16
  #3
Medlem
Citat:
Ursprungligen postat av darcode
Testa

Kod:
create TABLE texter2(
	text_id INT PRIMARY KEY AUTO_INCREMENT,
	rubrik varchar(128),
	text text(10000),
	addedby int NOT NULL FOREIGN KEY REFERENCES members2(id)
	
);

eller om du vill ha en namngiven foreign key constraint:

Kod:
create TABLE texter2(
	text_id INT PRIMARY KEY AUTO_INCREMENT,
	rubrik varchar(128),
	text text(10000),
	addedby int NOT NULL,

	CONSTRAINT fk_addedby FOREIGN KEY (addedby)
	REFERENCES members2(id)
	
);
Testade båda men bara den undre fungerade. Vad innebär foreign key contraint och vad menas med att den är namngiven?

Hade föresten helst av allt velat att addedby skulle vara en varchar och referera till username, men isåfall måste väl username vara primary key i members2? Och det är viktigt att id är primary key så jag antar att det inte går?
Citera
2013-02-04, 15:37
  #4
Medlem
Citat:
Ursprungligen postat av LaCie
Testade båda men bara den undre fungerade. Vad innebär foreign key contraint och vad menas med att den är namngiven?

Hade föresten helst av allt velat att addedby skulle vara en varchar och referera till username, men isåfall måste väl username vara primary key i members2? Och det är viktigt att id är primary key så jag antar att det inte går?
Provade nu att ange en kolumn med Foreign Key som i sin tur inte var primär-nyckel och det verkade faktiskt fungera. Trodde att den kolumnen man pekade på var tvungen att vara primärnyckel för att det skulle fungera, men tji fick jag :P
Citera
2013-02-04, 16:13
  #5
Medlem
darcodes avatar
Citat:
Ursprungligen postat av LaCie
Provade nu att ange en kolumn med Foreign Key som i sin tur inte var primär-nyckel och det verkade faktiskt fungera. Trodde att den kolumnen man pekade på var tvungen att vara primärnyckel för att det skulle fungera, men tji fick jag :P

Det går nog att peka på något som inte är primary ja, men det ska undvikas. Minsta kravet är dock att du refererar till en superkey, dvs en kolumn (eller en mängd kolumner) som är unik i den refererade tabellen.

EDIT: Varför vill du förresten ha just en VARCHAR där? Det normala är att man låter en FK referera till PK och gör en JOIN om man vill ha ut annan data ur den refererade tabellen.
__________________
Senast redigerad av darcode 2013-02-04 kl. 16:16.
Citera
2013-02-04, 17:21
  #6
Medlem
Citat:
Ursprungligen postat av darcode
Det går nog att peka på något som inte är primary ja, men det ska undvikas. Minsta kravet är dock att du refererar till en superkey, dvs en kolumn (eller en mängd kolumner) som är unik i den refererade tabellen.

EDIT: Varför vill du förresten ha just en VARCHAR där? Det normala är att man låter en FK referera till PK och gör en JOIN om man vill ha ut annan data ur den refererade tabellen.
Hm, de kolumnerna jag pekar till nu är visserligen inte primary key's men de är unika. Var det 'ok'?

enda anledningen till att jag vill ha username istället för id är egentligen för att få en bättre uppsikt när jag kollar runt i databasen. Har fortfarande svårt att förstå mig på joins men borde nog få tummen ur och lära mig det istället..

Sitter nu med ett problem där jag vill överföra värden från en tabell (tabell 1) till en annan (tabell 2). Problemet är att i en av kolumnerna i tabell 1(kolumn a) vill jag egentligen ha det värde som ligger granne med kolumn a i tabell 3....

Inser att det där måste ha varit helt obegripligt, ska återkomma med en illustration om du har lust att hjälpa mig. (Är föresten grymt tacksam för all hjälp!)

Men viktigast, förstod jag dig rätt angående unika kolumner i referens-kolumnen?
Citera
2013-02-04, 17:52
  #7
Medlem
darcodes avatar
Citat:
Ursprungligen postat av LaCie
Hm, de kolumnerna jag pekar till nu är visserligen inte primary key's men de är unika. Var det 'ok'?

enda anledningen till att jag vill ha username istället för id är egentligen för att få en bättre uppsikt när jag kollar runt i databasen. Har fortfarande svårt att förstå mig på joins men borde nog få tummen ur och lära mig det istället..

Sitter nu med ett problem där jag vill överföra värden från en tabell (tabell 1) till en annan (tabell 2). Problemet är att i en av kolumnerna i tabell 1(kolumn a) vill jag egentligen ha det värde som ligger granne med kolumn a i tabell 3....

Inser att det där måste ha varit helt obegripligt, ska återkomma med en illustration om du har lust att hjälpa mig. (Är föresten grymt tacksam för all hjälp!)

Men viktigast, förstod jag dig rätt angående unika kolumner i referens-kolumnen?

Ja, det är ok, men jag rekomenderar att du ser över din databasdesign och gör det rätt från början. Det sparar mycket tid i längen. Du borde nog läsa på lite om normalisering också, t.ex http://en.wikipedia.org/wiki/Boyce%E...dd_normal_form
Kortfattat går det ut på att du aldrig ska behöva upprepa data på flera ställen i en databas.

Om den enda anledningen att ha username i tabellen är för att lättare kunna titta på datan så skulle du kunna göra en view. Det är helt enkelt en lagrad query, i ditt fall nåt i stil med:
Kod:
SELECT texter2.*, members2.username FROM texter2 JOIN members2 ON texter2.addedby = members2.id;
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback