首先来说数据库中约束的定义是什么?
约束定义:按照表中的数据规则,如果存在违反约束的数据行为,行为就会被阻止。
一般在创建表之后就会创建相关列的约束,或者是在编写sql脚本时就定义好约束。比如常见的check约束:age>18 and age<65;
常见的约束类型:
1.主键约束
2.外键约束
3.默认值约束
4.检查约束
5.唯一性约束
6.非空约束
7.自增长约束
8.非负约束
下面逐一做讲解:
1.主键约束 Primary Key:在表中定义一个主键来唯一确定表中每一行数据的标识符。保证其,唯一且非空;
主键约束设计方式1:行内立即设置
CREATE TABLE student{ NAME VARCHAR(10) PRIMARY KEY, age INT };
方法2:最后声明设置
CREATE TABLE student{ NAME VARCHAR(10), age INT primary key(name) };
方法3:后期添加主键
alter TABLE student ADD PRIMARY KEY (name);
另外,也存在联合主键
联合主键:把多个字段看成一个整体添加主键
例如:
CREATE TABLE student{ NAME VARCHAR(10), age INT, PRIMARY KEY(NAME,age) };
删除语句:
删除主键:ALTER TABLE student DROP PRIMARY KEY;
删除非空:ALTER TABLE student CHANGE NAME NAME VARCHAR(20) NULL;
另注:要有其他约束要先删除其它约束,再来删除主键约束
2.外键约束 Foreign Key:加强两个表的一列或多列数据之间连接的;先定义主表的主键,再定义从表的外键。
只有主表(被参照表)中的主键才能被从表(参照表)用作外键使用;
主表限制了从表的插入和更新操作;(需要先从主表中插入)
从表限制了从表中数据的的删除;(当删除主表中的某条数据时,先删除从表中的相关数据,再删除主表中的相关数据)。
添加外键:
alter table 多表名称 add foreign key(外键名称) references 一表名称(主键);
其中,多表指关系中的多方,一表指关系中的一方,外键名称自定义,一般为一表名称_id,主要用于多表之间联系。添加外键约束后,主表不能删除从表中已引用的数据,从表不能添加主表中不存在的数据。
添加外键约束后,如何删除主表中的数据:
方法1:如上所说,可以先删除从表中的相关数据,在删除主表中的相关数据;
方法2:级联删除
ALTER TABLE orders ADD FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE;
级联更新:(代码如下)
ALTER TABLE order ADD FOREIGN KEY (user_id) REFERENCES users(id) ON UPDATE CASCADE;
3.默认值约束(又叫default约束):用户在插入新的数据行时,如果改行没有指定数据,那么系统将默认值赋给该列,如果没有默认值,系统将会默认为NULL;
SQL Server 2008中设置默认值的方法是: 插入值->设置的默认值->NULL
4.检查约束:(又叫Check约束)通过逻辑表达式来判断数据的有效性,用来限制输入一列或多列值的范围。
5.唯一性约束,又叫Unique约束:确保表中的一列数据没有相同的值。与主键约束相似但又不同(主键只能有一个,但一个表中可以定义多个唯一约束;唯一键可以为NULL但主键不可以)。详细可以参考下这个博客SQLServer主键约束和唯一约束的区别
CREATE TABLE student( NAME VARCHAR(20) UNIQUE NOT NULL, age INT UNIQUE NOT NULL )
6.非空约束:not null,使用方法跟主键一样,用not null约束的字段不能为null值,必须给定具体的数据。(代码略)
7.自增长约束:auto_increment,使用方法和主键约束一样。如果是整型字段,添加自增长约束后,还需要配合主键约束一起使用。
create table student( sid int auto_increment primary key, name varchar(20), )
建表时常给字段这种联合约束,方便查询。
8.非负约束:unsigned,使用方法和主键一样,需要强调的是!添加非负约束后,取值范围将发生变化,例如int范围是-128~127,添加非负约束后将变成0-255
参考:https://www.cnblogs.com/zhw511006/p/12826592.html
https://www.cnblogs.com/cloudtj/articles/6937355.html
https://blog.csdn.net/qq_37115780/article/details/100668568
https://blog.csdn.net/weixin_29789925/article/details/113149169
未完待续···