---
title: "Referentiell integritet i MySQL"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/119126-referentiell-integritet-i-mysql"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "lillebror"
published: "2005-01-02T15:54:29.000Z"
updated: "2005-01-02T19:27:19.000Z"
replies: 4
views: 569
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/119126-referentiell-integritet-i-mysql"
---

# Referentiell integritet i MySQL

## #1 — lillebror, 2005-01-02T15:54Z

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?! :)

Permalänk: https://www.webforum.nu/p/119126

## #2 — LarsG, 2005-01-02T15:58Z

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.

Permalänk: https://www.webforum.nu/p/1517401

## #3 — lillebror, 2005-01-02T15:59Z

Tack!

Permalänk: https://www.webforum.nu/p/1517403

## #4 — lillebror, 2005-01-02T18:07Z

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

Permalänk: https://www.webforum.nu/p/1517474

## #5 — LarsG, 2005-01-02T19:27Z

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.

Permalänk: https://www.webforum.nu/p/1517517

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/119126-referentiell-integritet-i-mysql
