Sunday, March 19, 2017

Foreign Key can allow NULLs

Hi All,

I recently did small schema design and found out that foreign keys allow NULLs if they reference to Unique Column (not primary key).

I am also mentioning the script below:

ALTER TABLE [dbo].[FKUniqueTest] DROP CONSTRAINT [FK_FKUniqueTest_Employee]
GO
/****** Object:  Index [IX_Employee]    Script Date: 3/20/2017 11:33:50 AM ******/
DROP INDEX [IX_Employee] ON [dbo].[Employee]
GO
/****** Object:  Table [dbo].[FKUniqueTest]    Script Date: 3/20/2017 11:33:50 AM ******/
DROP TABLE [dbo].[FKUniqueTest]
GO
/****** Object:  Table [dbo].[Employee]    Script Date: 3/20/2017 11:33:50 AM ******/
DROP TABLE [dbo].[Employee]
GO
/****** Object:  Database [QueryTest]    Script Date: 3/20/2017 11:33:50 AM ******/
DROP DATABASE [QueryTest]
GO
/****** Object:  Database [QueryTest]    Script Date: 3/20/2017 11:33:50 AM ******/
CREATE DATABASE [QueryTest] ON  PRIMARY
( NAME = N'QueryTest', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\QueryTest.mdf' , SIZE = 4096KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON
( NAME = N'QueryTest_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\QueryTest_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [QueryTest].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [QueryTest] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [QueryTest] SET ANSI_NULLS OFF
GO
ALTER DATABASE [QueryTest] SET ANSI_PADDING OFF
GO
ALTER DATABASE [QueryTest] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [QueryTest] SET ARITHABORT OFF
GO
ALTER DATABASE [QueryTest] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [QueryTest] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [QueryTest] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [QueryTest] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [QueryTest] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [QueryTest] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [QueryTest] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [QueryTest] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [QueryTest] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [QueryTest] SET  DISABLE_BROKER
GO
ALTER DATABASE [QueryTest] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [QueryTest] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [QueryTest] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [QueryTest] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [QueryTest] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [QueryTest] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [QueryTest] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [QueryTest] SET RECOVERY FULL
GO
ALTER DATABASE [QueryTest] SET  MULTI_USER
GO
ALTER DATABASE [QueryTest] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [QueryTest] SET DB_CHAINING OFF
GO
EXEC sys.sp_db_vardecimal_storage_format N'QueryTest', N'ON'
GO
/****** Object:  Table [dbo].[Employee]    Script Date: 3/20/2017 11:33:50 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Employee](
[id] [int] NULL,
[name] [varchar](50) NOT NULL
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[FKUniqueTest]    Script Date: 3/20/2017 11:33:50 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[FKUniqueTest](
[fid] [int] NULL,
[name] [int] NOT NULL
) ON [PRIMARY]

GO
INSERT [dbo].[Employee] ([id], [name]) VALUES (NULL, N'Varun')
GO
INSERT [dbo].[Employee] ([id], [name]) VALUES (1, N'Dimple')
GO
INSERT [dbo].[Employee] ([id], [name]) VALUES (2, N'Shilpa')
GO
INSERT [dbo].[FKUniqueTest] ([fid], [name]) VALUES (NULL, 1)
GO
INSERT [dbo].[FKUniqueTest] ([fid], [name]) VALUES (NULL, 2)
GO
INSERT [dbo].[FKUniqueTest] ([fid], [name]) VALUES (NULL, 3)
GO
INSERT [dbo].[FKUniqueTest] ([fid], [name]) VALUES (1, 4)
GO
INSERT [dbo].[FKUniqueTest] ([fid], [name]) VALUES (2, 6)
GO
INSERT [dbo].[FKUniqueTest] ([fid], [name]) VALUES (2, 7)
GO
/****** Object:  Index [IX_Employee]    Script Date: 3/20/2017 11:33:50 AM ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_Employee] ON [dbo].[Employee]
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[FKUniqueTest]  WITH CHECK ADD  CONSTRAINT [FK_FKUniqueTest_Employee] FOREIGN KEY([fid])
REFERENCES [dbo].[Employee] ([id])
GO
ALTER TABLE [dbo].[FKUniqueTest] CHECK CONSTRAINT [FK_FKUniqueTest_Employee]
GO
ALTER DATABASE [QueryTest] SET  READ_WRITE
GO