SQL常用约束语句

SQL常用约束语句SQL 常用约束语句常用五类约束 notnull 非空约束 指定某列不为空 nbsp unique 唯一约束 指定某列和几列组合的数据不能重复 nbsp primarykey 主键约束 指定某列的数据不能重复 唯一 nbsp foreignkey 外键 指定该列记录属于主表中的一条记录 参照另一条数据 nbsp check 检查 指定一个表达式 用于检验指定数据 nbsp 注意 MySQL 不支持

常用五类约束:
    not null:非空约束,指定某列不为空 
    unique: 唯一约束,指定某列和几列组合的数据不能重复 
    primary key:主键约束,指定某列的数据不能重复、唯一 
    foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据 
    check:检查,指定一个表达式,用于检验指定数据 
  注意: MySQL不支持check约束,但可以使用check约束,而没有任何效果; 

根据约束数据列限制,约束可分为:
    单列约束:每个约束只约束一列 










    多列约束:每个约束约束多列数据 


1、not null
  非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。 
     *Null类型特征: 所有的类型的值都可以是null,包括int、float等数据类型 空字符串””是不等于null,0也不等于null 
create table temp( 
id int not null, 
name varchar(255) not null default ‘abc’, 
sex char null 
)
上面的table加上了非空约束,也可以用alter来修改或增加非空约束 
增加非空约束 
  alter table temp modify sex varchar(2) not null; 
取消非空约束 
  alter table temp modify sex varchar(2) null; 
取消非空约束,增加默认值 













  alter table temp modify sex varchar(2) default ‘abc’; 


2、unique
  唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。虽然唯一约束不允许出现重复的值,但是可以为多个null,同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。 MySQL会给唯一约束的列上默认创建一个唯一索引;
create table temp ( 
id int not null, 
name varchar(25), 
password varchar(16), 
constraint uk_name_pwd unique(name, password) 
); 
 unique(name, password)表示用户名和密码组合不能重复 
  添加唯一约束 
    alter table temp add unique(name, password); 
  修改唯一性约束
    alter table temp modify name varchar(25) unique; 
  删除约束 
    alter table temp drop index name;

3、primary key
  主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束, 那么这些列都不允许为空值,并且组合的值不允许重复。 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
  MySQL的主键名总是PRIMARY, 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。 
列模式: 
  create table temp( 
  id int primary key, 
  name varchar(25) 
  ); 
  create table temp2( 
  id int not null, 
  name varchar(25), 
  pwd varchar(15), 
  constraint pk_temp_id primary key(id) 
  ); 
组合模式: 
  create table temp2( 
  id int not null, 
  name varchar(25), 
  pwd varchar(15), 
  constraint pk_temp_id primary key(name, pwd) 
  );
alter删除主键约束 
  alter table temp drop primary key; 
alter添加主键 
  alter table temp add primary key(name, pwd); 
alter修改列为主键 
  alter table temp modify id int primary key; 
设置主键自增 
  create table temp( 
  id int auto_increment primary key, 
  name varchar(20), 
  pwd varchar(16) 
  ); 
auto_increment自增模式,设置自增后在插入数据的时候就不需要给该列插入值了。

4、foreign key
  外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。 也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据, 然后才可以删除主表的数据。还有一种就是级联删除子表数据。
注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录, 那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束。
创建外键约束: 
主表 
  create table classes( 
  id int auto_increment primary key, 
  name varchar(20) 
  ); 
从表 
  create table student( 
  id int auto_increment, 
  name varchar(22), 
  constraint pk_id primary key(id), 
  classes_id int references classes(id) 
  ); 
通常先建主表,然后再建从表,这样从表的参照引用的表才存在。
表级别创建外键约束: 
  create table student( 
  id int auto_increment primary key, 
  name varchar(25), 
  classes_id int, 
  foreign key(classes_id) references classes(id) 
  ); 
上面的创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n, 其中student是表名,n是当前约束从1开始的整数。 
指定约束名称: 
  create table student( 
  id int auto_increment primary key, 
  name varchar(25), 
  classes_id int, 
  constraint fk_classes_id foreign key(classes_id) references classes(id) 
  ); 
多列外键组合,必须用表级别约束语法: 
  create table classes( 
  id int, 
  name varchar(20), 
  number int, 
  primary key(name, number) 
  ); 
  create table student( 
  id int auto_increment primary key, 
  name varchar(20), 
  classes_name varchar(20), 
  classes_number int, 
  foreign key(classes_name, classes_number) references classes(name, number) 
  ); 
删除外键约束: 
  alter table student drop foreign key student_ibfk_1; 
  alter table student drop foreign key fk_student_id; 
增加外键约束:
  alter table student add foreign key(classes_name, classes_number) references classes(name, number); 
自引用、自关联(递归表、树状表) 
  create table tree( 
  id int auto_increment primary key, 
  name varchar(50), 
  parent_id int, 
  foreign key(parent_id) references tree(id) 
  ); 
级联删除:删除主表的数据时,关联的从表数据也删除,则需要在建立外键约束的后面增加on delete cascade 或on delete set null,前者是级联删除,后者是将从表的关联列的值设置为null。
  create table student( 
  id int auto_increment primary key, 
  name varchar(20), 
  classes_name varchar(20), 
  classes_number int, /*表级别联合外键*/ 
  foreign key(classes_name, classes_number) references classes(name, number) on delete cascade





















































































































  ); 


5、check
  MySQL可以使用check约束,但check约束对数据验证没有任何作用。 
  create table temp( 
  id int auto_increment, 
  name varchar(20), 
  age int, 
  primary key(id), 
  check(age > 20) 
  ); 
上面check约束要求age必须大于20,但没有任何作用。但是创建table的时候没有任何错误或警告。

文章转自:https://www.cnblogs.com/980081922q/p/5978638.html











版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222360.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:57
下一篇 2026年3月17日 下午3:57


相关推荐

  • 【基因调控网络】基因调控网络及其模型

    【基因调控网络】基因调控网络及其模型基因调控网络及其模型概述基因调控网络模型布尔网络模型有向图模型线性组合模型加权矩阵模型互信息关联模型常微分方程模型基因调控机制基序和模块基因调控网络数据库概述基因调控网络是 21 世纪生物学研究的一个重要课题 其研究的主要内容有 每个网络节点的功能 基因网络结构 复杂性层次上的动力学机制和行为 在细胞和组织层次从基因到信号路径等各种问题 近年来 科学家发现传统遗传学假说是错误的 逐渐重视研究遗传网络 对于大型遗传网络的全局模型来说 要想知道一个生物体的所有细节和准确建立对应的模型几乎是不可能的 更

    2026年3月20日
    2
  • Qt中的QFile读写文件操作

    Qt中的QFile读写文件操作1.首先记录一下QString,QByteArray,char*之间的转换(1)QString->QByteArrayQStringbuf="123";QByteArraya=buf.toUtf8();//中文a=buf.toLocal8Bit();//本地编码(2)QByteArray->char*char*b=a.data…

    2022年6月13日
    30
  • SQL Server配置管理器没有任何项目

    SQL Server配置管理器没有任何项目今天安装了SQL2017后,连接数据库发现报sql错误2,想着是MSSQLSERVER服务没开,就去配置管理器打开,但是发现新安装的sql,显示没有任何项目辗转查了好久才发现导致的原因是:安装sql过程中,添加实例为当前系统用户,但是之后我修改过系统的计算机名称,导致原实例MSSQLSERVER不识别,所以不显示也不识别。解决方法有:(选择其中一种执行即可)(1)把计算机的名称

    2022年7月20日
    38
  • 64位CENTOS 5(RED HAT AS5)安装配置(web服务、邮件服务、WEB邮件)小记

    64位CENTOS 5(RED HAT AS5)安装配置(web服务、邮件服务、WEB邮件)小记

    2021年7月25日
    46
  • 蓝桥杯入门训练Fibonacci数列 C语言

    蓝桥杯入门训练Fibonacci数列 C语言Fibonacci 数列 C 语言问题描述 Fibonacci 数列的递推公式为 Fn Fn 1 Fn 2 其中 F1 F2 1 当 n 比较大时 Fn 也非常大 现在我们想知道 Fn 除以 10007 的余数是多少 输入格式输入包含一个整数 n 输出格式输出一行 包含一个整数 表示 Fn 除以 10007 的余数 说明 在本题中 答案是要求 Fn 除以 10007 的余数 因此我们只要能算出这个余数即可 而不需要先计

    2025年6月25日
    2
  • innerHTML和outerHTML的区别

    innerHTML和outerHTML的区别为什么要总结innerHTML和outerHTML的区别呢,主要是在看vue.js官方文档时,看到生命周期时)]原生的方法有点忘了,所以要重拾起来。示例如下:<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><metaname=”viewport”content=”width=device-width,initial-scale=1.0″>

    2022年6月25日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号