-- Database by Doug
-- Douglas Kline
-- 10/1/2018
-- Foreign Keys
USE Northwind
-- Foreign Keys
-- a field in one table (table A)
-- that references a primary key value in another table (table B)
-- for example, the Categories and Products table from Northwind
-- (show diagram)
-- in this case, the foreign key is
-- Products.CategoryID, i.e., the CategoryID field in Products
-- from a practical usage standpoint
-- the foreign key is a "lookup"
-- consider this:
SELECT ProductID,
ProductName,
CategoryID
FROM Products
SELECT CategoryID,
CategoryName
FROM Categories
-- note how I can use the Products.CategoryID
-- value to find the CategoryName of the right Category
-- note that Primary Keys are UNIQUE and NOT NULL
-- e.g., Products.ProductID, Categories.CategoryID
-- but Foreign Keys can be NOT UNIQUE and NULL
-- e.g., Products.CategoryID
-- in this situation, many products can be
-- in the same category
-- and a product could have an unknown category
-- (products can exist without a category)
-- in a sense, FKs define a "relationship"
-- between two records
-- in this case, each product record is related
-- to a category record
-- (or not, in the case of NULL FK)
-- to be able to "lookup" from one table to another
-- you just need two fields of similar data types
-- however, what if you want to make sure
-- that the lookups values are always *good*
-- in other words, that values in
-- Products.CategoryID are actually over in
-- the Categories table?
-- this requirement, that FK values are valid
-- is called *referential integrity*
-- note that this is a constraint on
-- the Products.CategoryID field
-- it must be a valid value that
-- exists over in the Categories.CategoryID field
-- let's see it in the definition of Products
CREATE TABLE [dbo].[Products]
(
[ProductID] [int] IDENTITY(1,1) NOT NULL,
[ProductName] [nvarchar](40) NOT NULL,
[CategoryID] [int] NULL
-- other fields omitted for clarity
CONSTRAINT [PK_Products]
PRIMARY KEY CLUSTERED
(
[ProductID] ASC
)
CONSTRAINT [FK_Products_Categories]
FOREIGN KEY
(
[CategoryID]
)
REFERENCES [dbo].[Categories] ([CategoryID])
)
-- note the REFERENCES section
-- note the allowed NULL for CategoryID
-- this means that on any UPDATE or INSERT to Products
-- a Product record must always have a valid CategoryID
-- or a NULL value (unknown)
-- (demo this)
-- it also means that on any UPDATE or DELETE to Categories
-- all Product records must always have a valid CategoryID
-- or a NULL value (unknown)
-- (demo this)
-- If we have referential integrity for all Product records
-- then we can be confident that our JOINs between the two tables
-- provide valid results
SELECT Products.ProductID,
Products.ProductName,
Products.CategoryID,
Categories.CategoryID,
Categories.CategoryName
FROM Products
JOIN Categories ON Products.CategoryID = Categories.CategoryID
ORDER BY Products.ProductID
-- JOINs are a way of doing multiple "lookups"
-- of FK values to PK values
-- but that's another video...
-- in summary,
-- foreign keys provide a "lookup" mechanism
-- for records in two different tables
-- this also defines how the two tables are "related"
-- *referential integrity* enforces "good" foreign keys
-- in other words, a FK should always have a valid value
-- FK values can repeat - be non-UNIQUE
-- FK values can be NULL - unknown
-- thanks for watching!
-- Database by Doug
-- Douglas Kline
-- 10/1/2018
-- Foreign Keys
Thursday, October 4, 2018
Foreign Keys in Relational Databases
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment