---
title: "Uppdatera foreign keys vid ändring av primary key?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/173624-uppdatera-foreign-keys-vid-ändring-av-primary-key"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "k0ffe"
published: "2008-08-25T11:40:18.000Z"
updated: "2008-08-25T17:58:23.000Z"
replies: 7
views: 509
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/173624-uppdatera-foreign-keys-vid-ändring-av-primary-key"
---

# Uppdatera foreign keys vid ändring av primary key?

## #1 — k0ffe, 2008-08-25T11:40Z

Hej!

Jag har två tabeller, låt säga; tbl_parent, tbl_child. Den sistnämnde har en referens till tbl_parent.

```
tbl_parent
------------
ID | text
23 | pappa
24 | pappa 2
25 | mamma

tbl_child
------------
ID | parentID | text
13 |    23   |  barn 1
14 |    24   |  barn 2
```

Om jag nu raderar posten "pappa" i tbl_parent så vill jag göra något av följande alternativ:
1\. Antingen uppdatera alla nedanstående ID:n med -1 (för att då referera "barn 1" i tbl_child till "pappa 2" i tbl_parent).
2\. Eller, uppdatera parentID i tbl_child med +1. 

Hur skulle ni smidigast lösa detta?

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

## #2 — spango, 2008-08-25T11:44Z

Med cascading updates. DBMS?

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

## #3 — k0ffe, 2008-08-25T12:10Z

Men går det verkligen? Det är ju ingen update jag ska göra, utan en delete. Cascade delete skulle väl isåfall radera mina foreign keys. 

DBMS är mySQL.

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

## #4 — spango, 2008-08-25T12:46Z

D'oh, borde kanske ta och läsa mer än rubriken ;)
Du får göra en trigger som lyssnar på delete.
<http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html>

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

## #5 — k0ffe, 2008-08-25T13:53Z

Intressant!

Något sånt här kanske?

```
CREATE TRIGGER parent_delete BEFORE DELETE ON parent
 FOR EACH ROW BEGIN
    UPDATE parent SET ID = OLD.ID - 1
 END;
```

Men hur får jag den att gälla från och med den raderade posten?
Raderar jag ID nr 10 så ska ju nr 11 och uppåt minska med 1, men nr 9 och neråt ska kvarstå?

```
UPDATE parent SET ID = OLD.ID - 1 WHERE ID > "deletedID" ?
```

?

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

## #6 — spango, 2008-08-25T14:00Z

Sätter du ID till OLD.ID - 1 kommer alla uppdaterade poster få den raderade postens ID-1, vilket väl inte är målet? Det borde bli typ *UPDATE parent SET ID = ID - 1 WHERE ID \> OLD.ID*

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

## #7 — k0ffe, 2008-08-25T14:09Z

Ok!

Och "OLD.ID" innebär den raderade postens ID?

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

## #8 — spango, 2008-08-25T17:58Z

Det verkar inte bättre...

> **Manualen skrev:**
>
> You can refer to columns in the subject table (the table associated with the trigger) by using the aliases OLD and NEW. OLD.col_name refers to a column of an existing row before it is updated or deleted. NEW.col_name refers to the column of a new row to be inserted or an existing row after it is updated.

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/173624-uppdatera-foreign-keys-vid-ändring-av-primary-key
