-- 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