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?
A FOREIGN KEY is a field (or collection of fields) in one table, that refers to the PRIMARY KEY in another table. The table with the foreign key is called the child table, and the table with the primary key is called the referenced or parent table.
A foreign key is a column (or combination of columns) in a table whose values must match values of a column in some other table. FOREIGN KEY constraints enforce referential integrity, which essentially says that if column value A refers to column value B, then column value B must exist.
To see foreign key relationships of a table: SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA. KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = 'db_name' AND REFERENCED_TABLE_NAME = 'table_name';
A primary key is used to ensure data in the specific column is unique. A foreign key is a column or group of columns in a relational database table that provides a link between data in two tables. 2. It uniquely identifies a record in the relational database table.
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 INT NOT NULL) CREATE TABLE employee (id INT NOT NULL, dept_id INT 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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With