webForumDet fria alternativet

Referentiell integritet i MySQL

Databaser & SQL

4 svar · 559 visningar · startad av lillebror

Medlem sedan apr. 20041 597 inlägg
Frågan#1

Hej!

Jag har precis gått över till PHP och MySQL. Tidigare använde jag mig av ASP och Access. Nu har jag en fråga jag undrar över.

I Access när jag skapar tabeller kan jag ange främmandenycklar (både en och två) i de tabeller jag skapar för att vara säker på att den referentiella integriteten upprätthålls mellan tabellerna. Nu när jag har kollat runt i användargränsnittet PHPAdmin har jag inte kommit underfund med hur jag gör samma sak i MySQL?

Så här kan det se ut när jag skapar en tabell i Access med ett SQL-kommando.

CREATE TABLE tblMember (
 memberID      COUNTER NOT NULL,
 Username    VARCHAR(10) NOT NULL,
 Firstname   VARCHAR(15) NOT NULL,
 Lastname VARCHAR(20) NOT NULL,
 Dob DATE NOT NULL,
 RegDateTime DATE NOT NULL,
 LastVisit DATE NOT NULL,
 Email VARCHAR(30),
 Online INTEGER NOT NULL, 
 PostalCodeID INTEGER NOT NULL,
 MembershipLevelID INTEGER NOT NULL,
 CONSTRAINT tblMember_pk PRIMARY KEY(MemberID),
 CONSTRAINT tblMember_fk1 FOREIGN KEY(PostalCodeID) REFERENCES  
 tblPostalCode(PostalCodeID), 
 CONSTRAINT tblMember_fk2 FOREIGN KEY(MembershipLevelID) REFERENCES  
 tblMembershipLevel(MembershipLevelID));

Fungerar det att skapa tabeller med SQL-kommando även i MySQL med tillhörande främmandenycklar? Någon som har några kloka tankar om detta?! :)

Medlem sedan dec. 200012 464 inlägg
#2

Det går under vissa förutsättningar. Du måste använda InnoDB och du måste skapa index för de kolumner som ingår i nycklarna. Läs mer i manualen på www.mysql.com, sök t.ex. på foreign key.

Medlem sedan apr. 20041 597 inlägg
#3

Tack!

Medlem sedan apr. 20041 597 inlägg
#4

Nu har jag läst om "foreign keys" och nedan är ett exempel på hur man i MySQL kan skriva samma CREATE-sats som ovan med referentiell integritet.

CREATE TABLE parent(
parentID INT NOT NULL,
PRIMARY KEY (parentID)
) TYPE=INNODB;

CREATE TABLE child(
childID INT, 
parentID INT,
INDEX parent_index (parentID),
FOREIGN KEY (parentID) REFERENCES parent(parentID)
ON DELETE CASCADE
) TYPE=INNODB;

När man använder "foreign keys" med InnoDB-typen står det att tabellen som en annan tabell refererar till måste vara indexerad. Vad jag förstått sker detta automatiskt men vad händer rent fysiskt i databasen när en sådan sker?

Sist en fråga, vad exakt innebär CASCADE i databassammanhang?

Mvh,
Fredrik

Medlem sedan dec. 200012 464 inlägg
#5

Ett index innebär att man skapar en ny tabell som innehåller data från de indexerade kolumner och en referens till den ursprungliga posten. Du kan inte referera en indextabell utan den hanteras enbart internt av databashanteraren.

On delete cascade innebär att en delete-operation på den tabell som innehåller primärnyckeln medför även en delete på de poster i den refererande tabell som refererar de borttagna primärnyckelsvärdena.

Om index skapas implicit beror på vilken version du använder.

250 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)