首页 > 数据库 >SQL学习——数据库定义语言(DDL)定义约束

SQL学习——数据库定义语言(DDL)定义约束

时间:2022-08-25 19:00:07浏览次数:100  
标签:SQL 列名 表名 定义语言 约束 CONSTRAINT KEY DDL 语法结构

  本章将介绍数据库中的约束是什么,如何给表之间建立约束。

1、约束类型介绍

  主要有5中约束,包括:

  • 非空约束(NOT NULL):指定列不能包含空值
  • 唯一性约束(UNIQUE):指定列或者列组合的值对于表中的行是唯一的
  • 主键约束(PRIMARY KEY):表每一行的唯一表示,同时包含非空约束和唯一性约束
  • 外键约束(FOREIGN KEY):在表和引用表的一个列之间建立并且强制建立一个外键关系
  • 用户自定义约束(CHECK):指定一个必须为真的条件

1.1、定义约束原则

  我们可以在创建表的时候创建一个约束,也可以在创建表之后再给这个表定义约束。

  可以给约束起名字(默认使用SYS_C数字串),但名字在整个用户的所有约束中必须是唯一的。

2、定义非空约束(NOT NULL)

2.1、创建表时给定非空约束

语法结构:

CREATE TABLE 表名
(列名1 列属性1 NOT NULL,
 列名2 列属性2 CONSTRAINT 约束命名 NOT NULL,
 ....
)

  上述语法中对列名1的非空约束是采用系统自动命名,而列名2的约束采用的是用户指定命名。

2.2、为已有存在的列增加非空约束

  只需要使用前一篇文章(SQL学习——数据库定义语言(DDL)建表、删表、修改表)中讲到的ALTER操作即可,相当于是修改表中列的某个属性。

语法结构:

ALTER TABLE 表名
MODIFY (列名 [CONSTRAINT 约束命名] NOT NULL,...)

3、定义唯一性约束(UNIQUE)

  与2部分的语法结构基本一致,只需要将NOT NULL改为UNIQUE即可。

3.1、创建表时给定唯一性

语法结构:

CREATE TABLE 表名
(列名1 列属性1 UNIQUE,
 列名2 列属性2 CONSTRAINT 约束命名 UNIQUE,
 ....
[CONSTRAINT 约束命名] UNIQUE(列名1,列名2)
)

  这里相比于NOT NULL增加了一种方式,可以在创建表语句的最后使用UNIQUE(列名)的形式。

3.2、为已有存在的列增加唯一性

语法结构:

ALTER TABLE 表名
MODIFY (列名 [CONSTRAINT 约束命名] UNIQUE,....)

4、定义主键约束(PRIMARY KEY)

4.1、创建表时定义

语法结构:

CREATE TABLE 表名
(列名1 列属性1 PRIMARY KEY,
 列名2 列属性2 CONSTRAINT 约束命名 PRIMARY KEY,
 ....
[CONSTRAINT 约束命名] PRIMARY KEY(列名1,列名2) 
)

  需要注意的是主键约束对一张表只能有一列,所以上述三种方法只有一种能存在(换句话说只有一个PRIMARY KEY)保留字。如果想使用联合主键,则使用第三种方式(即在最后使用PRIMARY KEY(列1列2))。

4.2、增加列的主键约束

语法结构:

ALTER TABLE 表名
ADD CONSTRAINT 约束命名 PRIMARY KEY(列名1,列名2)

  这里需要注意增加约束是使用add而不是modify。

4.3、联合主键

  前面已经提到了,联合主键的定义方式只能在末尾增加的形式。

语法结构:

CREATE TABLE 表名
(列名1 列属性1 ,
 列名2 列属性2,
 ....
[CONSTRAINT 约束命名] PRIMARY KEY(列名1,列名2) 
)

5、定义外键约束(FOREIGN KEY)

5.1、创建表时定义

语法结构:

CREATE TABLE 表名
(列名1 列属性1 ,
 列名2 列属性2,
 ....
CONSTRAINT 约束命名 FOREIGN KEY(列名1) REFERENCE 参照表A表名(列名A),
[CONSTRAINT 约束命名 FOREIGN KEY(列名2) REFERENCE 参照表B表名(列名B)]
)

  注意被参照的表一定要存在。

5.2、增加列的外键约束

  与增加主键约束一样,也是使用alter table add语法。

语法结构:

ALTER TABLE 表名
ADD CONSTRAINT 约束命名 FOREIGN KEY(列名) REFERENCE 参照表表名(列名A)

6、用户自定义约束(CHECK)

6.1、创建表时给定CHECK约束

语法结构:

CREATE TABLE 表名
(列名1 列属性1 [CONSTRAINT 约束命名] CHECK(条件表达式),
 列名2 列属性2,
 ....
)

6.2、修改表时定义CHECK约束

语法结构:

ALTER TABLE 表名
ADD (CONSTRAINT 约束命名 CHECK(条件表达式),
....
)

  注意这里使用的是ADD进行添加约束,这里可能会思考为什么没有指定哪一个列呢?因为自定义约束是对整个表的约束,因此不用指定在某一个列上。

7、启用与禁用约束

7.1、查询约束

  当我们设定一个约束只有,Orcale数据库将会把这个约束信息储存在user_constraints这个字典表中,因此我们可以使用一下SQL查询语法来查看某个表的约束信息。

SELECT constraint_name, constraint_type, search_condition
FROM user_constraints
WHERE table_name=表名

  注意这里的表名,会被储存为大写,所以要注意查表名的时候要全部大写。

 7.2、禁用约束

  对于约束,我们可以对约束禁用的。

语法结构:

ALTER TABLE 表名
DISABLE CONSTRAINT 约束名 CASCADE

  这里要注意约束名对于约束来说是唯一的,因此我们可以通过查询约束的方法得到这个约束名,从而完成停用操作。注意这里的CASCADE关键字是可以保证与该约束关联的其他约束也一并禁用了(例如你要禁用的约束是主键约束,并且这个约束被其他表作为参照外键了,因此如果不加这个CASCADE关键字,将报错)

7.3、启用约束

语法结构:

ALTER TABLE 表名
ENABLE CONSTRAINT 约束名

  注意到,如果表中有违反约束的数据,则需要先删除数据之后才能启用约束。

  

 

标签:SQL,列名,表名,定义语言,约束,CONSTRAINT,KEY,DDL,语法结构
From: https://www.cnblogs.com/CircleWang/p/16624471.html

相关文章

  • Mysql中空间字段类型Wkt和Wkb的坑
    工作中遇到空间数据,提供给我们的是二进制的Wkt的格式,存储在Mysql数据库中,采集的时候告知我们是Wkb的数据格式,由于第一次接触这样的数据格式,去查了官方文档https://www.mys......
  • MySQL搭建主从集群详细步骤~
    一、Docker安装MySQL搭建主从dockerrun[OPTIONS]IMAGE[COMMAND][ARG...]dockerrun-p3306:3306很多-d--namehahamysql:5.7Docker启动容器的数据......
  • Java 连接 MySQL
    让Java和MySQL连接起来-囧雪诺-博客园 https://www.cnblogs.com/jonsnow/p/6246131.htmlJava连接MySQL需要驱动包,可以下载菜鸟教程提供的 jar包:http://stati......
  • Mysql 存储引擎(Innodb & MyIsam)
    SHOWENGINES;#查看mysql上面全部的存储引擎  下面主要讲解Innodb&MyIsam1.数据结构a.Innodb数据,索引,表结构都存在一个.ibd文件里b.MyIsam在磁盘上存储分......
  • SQL常用函数
    1、初始化一个MYSQL结构MYSQL*mysql_init(MYSQL*mysql)2、关闭一个服务器连接,并释放与连接相关的内存voidmysql_close(MYSQL*mysql);3、连接一个MySQL服务......
  • SQL学习——数据库定义语言(DDL)建表、删表、修改表
    DDL语言主要是帮助我们创建数据库对象的。CREATE:创建数据库对象DROP:删除数据库对象ALTER:修改数据库对象RENAME:修改数据库对象名称这要注意数据库对象不止包......
  • MSSQL服务丢失后,恢复mssql服务的方法
     服务器突然MSSQL的服务丢了,用下面这个方法,不用重装MSSQLserver了sccreateMSSQLSERVERbinpath="\"C:\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQ......
  • 数据篇(MongoDB+ElasticSearch+Minio+TiDB+MySQL+Redis)
    一. 简介1. MongoDB  2. ElasticSearch  3. Minio   4. TiDB  5. MySQL   6. Redis         二. 目录  ......
  • mysql 不可重复读与幻读的区别
    不可重复读的重点是修改:同样的条件,你读取过的数据,再次读取出来发现值不一样了幻读的重点在于新增或者删除同样的条件,第1次和第2次读出来的记录数不一样当然,从......
  • SQLite 将字符串拼接
    SQLite中不是使用的‘+’来操作,是需要使用特殊符号“||”例如:如果是其他字段形式的需要先装换为字符型使用CAST(字段名asTEXT)selectCAST(columnasTEXT)||'%'from......