sql基础语法-创建表和约束
创建数据库表
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

验证外键约束,删除主表记录,主表中的值被其他表引用,empid=1的记录在order中被引用,故删除错误
USE [SQL2016]
DELETE FROM dbo.Employees WHERE empid=1
GO

验证外键约束,UPDATE主表记录,主表中的值被其他表引用,empid=1的记录在order表中被引用,故更新失败
USE [SQL2016]
UPDATE dbo.Employees set empid=4 where empid=1
GO

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

其他选项:
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

CHECK 约束仅当false时拒绝操作,当为true和unknow时允许操作,例如
-1000,拒绝操作
5000,允许操作
NULL,允许操作
WITH NOCHECK 选项:
sql基础语法-创建表和约束的更多相关文章
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- [SQL基础教程] 1-5 表的删除和更新
[SQL基础教程] 1-5 表的删除和更新 表的删除 语法 DROP TABLE <表名>; 法则 1-12 删除的表无法恢复 表定义的更新 语法 ALTER TABLE<表名> ...
- openresty开发系列15--lua基础语法4表table和运算符
openresty开发系列15--lua基础语法4表table和运算符 lua中的表table 一)table (表)Table 类型实现了一种抽象的"关联数组".即可用作数组,也 ...
- SQL 基础语法(创建表空间、用户、并授予权限、数据的增删改查) --(学习笔记)[转]
--创建表空间 名:lyayzh_test create tablespace lyayzh_test --创建表数据文件 名:lyayzh_test_data.dbf 必须以dbf为后缀 dataf ...
- [Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图
目录 写在前面 文档与系列文章 表及其约束 存储过程 视图 总结 写在前面 由于一直在山西出差,有几天没更新博客了.昨晚回到家,将博客园最近三天更新的文章搜集了一下,花费了半天的时间,看了看,有些文章 ...
- SQL 基础语法(一)
SQL 语法 数据库表 一个数据库通常包含一个或多个表.每个表由一个名字标识(例如"客户"或者"订单").表包含带有数据的记录(行). 下面的例子是一个名为 & ...
- SQL基础语法提纲
一.SQL需知5点 1.SQL是Structured Query Language的缩写,是用来访问关系型数据库的,非过程化的,高级编程语言. 2.SQL具有语法高度综合统一,高度的非过程化,对集合进 ...
- SQL学习笔记:表的约束
目录 NOT NULL约束 INDEX 索引 CHECK 约束 DEFAULT 约束 UNIQUE 约束 PRIMARY KEY 约束 FOREIGN KEY 约束:简单的说,就是创建表的时候,对表或 ...
- MySQL数据分析-(10)SQL基础操作之表操作
大家好,我是jacky,很高兴跟大家继续分享MySQL数据分析实战课程,前面我们学习了库层面增删改查的SQL语句,这次课jacky将给大家介绍表层面的增删改查, (一)本课时的学习逻辑 表层面的增删改 ...
随机推荐
- c++string 输入换行符
string 一次只能输入一行,不含换行符.可以自己添加换行符 和输入行数.例如:#include <iostream>#include <string>using names ...
- CH 5102 Mobile Service(线性DP)
CH 5102 Mobile Service \(solution:\) 这道题很容易想到DP,因为题目里已经说了要按顺序完成这些请求.所以我们可以线性DP,但是这一题的状态不是很好设,因为数据范围有 ...
- BZOJ5379: Tree
BZOJ5379: Tree Description JudgeOnline/upload/201806/1.pdf 题解Here! 题目大意就是:1. 换根.2. 对$LCA(u,v)$的子树修改. ...
- 文件读写&&内容替换
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- 织梦dedecms页面中增加二维码功能的实现方法
本文介绍了在dedecms中增加二维码功能的实现方法,有时需要在dedecms页面增加二维码,方便手机用户访问,有需要的朋友参考下. 本节内容: dedecms中增加二维码功能 1.打开/incl ...
- Android font
╔════╦════════════════════════════╦═════════════════════════════╗ ║ ║ FONT FAMILY ║ TTF FILE ║ ╠════ ...
- 【前端】CentOS 7 系列教程之六: 安装 mysql 5.7
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/linux_6.html 进入/usr/local/src目录 cd /usr/local/src 下载mysql的 ...
- Linux和windows下执行sql脚本文件
利用 sqlplus 登录数据库之后 键入: @/全路径/文件名 即可执行*.sql 文件 例 假设有一个 test.sql 文件 所在路径是/home/oracle/ ...
- 六个优雅的 Linux 命令行技巧
一些非常有用的命令能让命令行的生活更满足,使用 Linux 命令工作可以获得许多乐趣,但是如果您使用一些命令,它们可以减少您的工作或以有趣的方式显示信息时,您将获得更多的乐趣.在今天的文章中,我们将介 ...
- Intelidea右键新建选项没有Java class选项
Intelidea创建好项目之后,右键新建Java class的时候发现没有改选项,只有以下几个选项 把sec目录设为源码目录,首先打开Project Structure