views:

307

answers:

3

Is there any good explanation of how to use MySQL's foreign key construct?

I don't quite get it from the MySQL docs themselves. Up until now I've been handling things like foreign keys with joins and programming code.

And the second part of the question, are there any improvements to be made by using MySQL's inbuilt foreign keys?

+6  A: 

FOREIGN KEYS just ensure your data are consistent.

They do not improve queries in sense of efficiency, they just make some wrong queries fail.

If you have a relationship like this:

CREATE TABLE department (id NOT NULL)
CREATE TABLE employee (id NOT NULL, dept_id NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, then you cannot delete a department if it has some employee's.

If you supply ON DELETE CASCADE to the FOREIGN KEY definition, the referencing rows will be deleted automatically along with the referenced ones.

As a constraint, FOREIGN KEY actually slows down the queries a little.

Extra checking needs to be performed when deleting from a referenced table or inserting into a referencing one.

Quassnoi
The slowdown is minimal, because you usually make FK on indexed fields, which makes finding the relevant values a snap.
Seb
That's why I wrote "a little" :) Actually, of you delete lots of rows, the underlying `JOIN` may be much less efficient that two DELETE's using FULL TABLE SCAN's
Quassnoi
+3  A: 

The main advantage is that you can limit which values you can enter in the table; if you try to enter a value that doesn't exist in the referenced table, you won't be able to do it.

Also, if you update or delete the value in the referenced table, you can set it to automatically update the value or delete in cascade any row containing that value.

It's indeed a great feature leveraging your code.

Seb
+5  A: 

The main benefits of using real foreign keys are ensuring data integrity, and being able to set up cascading actions on related items when something is modified or deleted.

For example, imagine you're programming a forum. You have a "topics" table with primary key topics.topic_id, and you have a "posts" table where posts are attached to topics with the column posts.topic_id, which is a foreign key to the topics table.

This foreign key relationship ensures that every post is attached to a valid topic. If the only topic you have has ID #1, it's impossible for there to exist a post in the database attached to topic #2. The database ensures this.

For the cascading benefit, you can set it up so that if a topic is deleted from the topic table, the database automatically deletes all the posts in the posts table that were attached to this topic. This is nice because it removes a step that you have to remember to do manually, which can get quite complex when you have many tables linked together. With foreign keys all the relationships can be cleaned up automatically.

Chad Birch