创建数据库表

USE SQL2016
IF OBJECT_ID('dbo.Employees','U') IS NOT NULL
DROP TABLE dbo.Employees; Create TABLE dbo.Employees
(
empid INT NOT NULL,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
salary Money Null
); USE SQL2016
IF OBJECT_ID('dbo.Orders','U') IS NOT NULL
DROP TABLE dbo.Orders; Create TABLE dbo.Orders
(
orderid INT NOT NULL,
empid INT NOT NULL,
customerid VARCHAR(30) NOT NULL,
qty INT NOT Null,
orderdatetime DATETIME2 NOT NULL,
CONSTRAINT PK_Orders--建立表时,直接创建主键约束
PRIMARY KEY (orderid)
);
--表已经存在,创建主键约束
ALTER TABLE dbo.Employees
ADD CONSTRAINT PK_Employees
PRIMARY KEY(empid); --唯一约束
ALTER TABLE dbo.Employees
ADD CONSTRAINT UNQ_Employees_lastname
UNIQUE(lastname); --外键约束
ALTER TABLE dbo.Orders
ADD CONSTRAINT FK_Orders_Employees
FOREIGN KEY(empid)
REFERENCES dbo.Employees(empid); --CHECK约束
ALTER TABLE dbo.Employees
Add CONSTRAINT CHK_Employees_Salary
CHECK(salary>0.00); --默认约束
ALTER TABLE dbo.Orders
ADD CONSTRAINT DFT_Orders_orders
DEFAULT(SYSDATETIME()) FOR orderdatetime

创建测试数据

--创建测试数据

--以下两段脚本创建了 两个employee

USE [SQL2016]
GO INSERT INTO [dbo].[Employees]
([empid]
,[firstname]
,[lastname]
,[salary])
VALUES
(1,'zhang','san',5000)
GO INSERT INTO [dbo].[Employees]
([empid]
,[firstname]
,[lastname]
,[salary])
VALUES
(2,'li','si',6000)
GO --以下脚本创建了两个orders USE [SQL2016]
GO INSERT INTO [dbo].[Orders]
([orderid]
,[empid]
,[customerid]
,[qty])
VALUES
(1,1,'CUS1',10)
GO INSERT INTO [dbo].[Orders]
([orderid]
,[empid]
,[customerid]
,[qty])
VALUES
(2,2,'CUS2',20)
GO

验证约束条件

验证外键约束,empid为3的employee不存在,故以下脚本报错

USE [SQL2016]
GO INSERT INTO [dbo].[Orders]
([orderid]
,[empid]
,[customerid]
,[qty])
VALUES
(3,10,'CUS1',10)
GO

sql基础语法-创建表和约束-LMLPHP

验证外键约束,删除主表记录,主表中的值被其他表引用,empid=1的记录在order中被引用,故删除错误

USE [SQL2016]
DELETE FROM dbo.Employees WHERE empid=1
GO

sql基础语法-创建表和约束-LMLPHP

验证外键约束,UPDATE主表记录,主表中的值被其他表引用,empid=1的记录在order表中被引用,故更新失败

USE [SQL2016]
UPDATE dbo.Employees set empid=4 where empid=1
GO

sql基础语法-创建表和约束-LMLPHP

外键约束默认执行 no action引用操作,即delete 和 update 数据时,如果被引用,则默认不允许操作。

sql基础语法-创建表和约束-LMLPHP

其他选项:
CASCADE:将级联相关的行
SET DEFAULT:将相关行设置为默认值
SET NULL:将相关行设置为NULL

将Delete Rule 和Update Rule 改为 CASCADE后。

执行以下脚本,将empid=1改为4,删除empid=2的记录。则应该自动修改Orders里的empid=1的改为4,删除empid=2的orders

USE [SQL2016]
GO
UPDATE dbo.Employees set empid=4 where empid=1 DELETE FROM dbo.Employees WHERE empid=2 GO SELECT * FROM dbo.Orders

sql基础语法-创建表和约束-LMLPHP

CHECK 约束仅当false时拒绝操作,当为true和unknow时允许操作,例如
-1000,拒绝操作
5000,允许操作
NULL,允许操作
WITH NOCHECK 选项:

05-11 10:48