2.数据库约束
2016-01-23 15:32
267 查看
约束:
在表上强制执行的数据校验规则,保证数据库里数据的完整性。当表中数据相互依赖时,保证相关数据不被删除。
也是数据库对象,也有自己的名字。
约束通常无法修改。
大部分数据库支持一下5种约束:
NOT NULL:非空约束,指定某列不能为空;
UNIQUE:唯一约束,指定某列或几列组合的数据不能重复;
PRIMARY KEY:主键,指定该列的值可以唯一地标识该条记录;
FOREIGN KEY:外键,指定改行记录从属于主表中的一条记录,主要用于保证参照完整性;
CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。
MySQL不支持CHECK约束(可以使用,但没有任何作用)。
约束分类:
①单列约束;②多列约束(可约束多个数据列)。
约束时机:
建表同时为相应数据列指定约束;
建表后创建,以修改表的方式增加约束。
列级约束语法、表级约束语法。
Note:
MySQL使用information_schema数据库的TABLE_CONSTRAINTS表保存该数据库实例的所有约束信息,可通过该表查询。
SQL中的null:
不区分大小写;所有类型均可以为null(包括int、boolean);空字符串和0不等于null。
1、NOT NULL:列级
有not null当然也有null。
①建表指定:
CREATE TABLE person (
id INT NOT NULL,
age VARCHAR(2)NULL
)
②alter修改表时增删:
ALTER TABLE person
#增加非空约束
MODIFY username VARCHAR(10)NO
TNULL,
#取消非空约束
MODIFY age INT NULL,
#取消非空约束,并指定默认值
MODIFY grade INT DEFAULT 99 NULL;
2、UNIQUE:列级、表级
列不可以出现重复值,null除外(数据库中null不等于null)。
单列:使用列级约束语法【第一约束名即为字段名,其他加序号,如id_2】
CREATE TABLE unique_test (id INT UNIQUE);
多列、自行指定约束名:使用表级约束语法【格式:constraint 约束名 约束定义】
①建表时-分别建立唯一约束:
CREATE TABLE unique_test (
#非空约束
id INT NOT NULL,
uname VARCHAR(25),
pwd VARCHAR(25),
#表级约束语法建立唯一约束
UNIQUE(uname),
#表级约束语法建立唯一约束,并指定约束名uni
CONSTRAINT uni UNIQUE(pwd)
);
②建表时-列组合建立唯一约束:
CREATE TABLE unique_test (
#非空约束
id INTNOTNULL,
uname VARCHAR(25),
pwd VARCHAR(25),
#表级约束语法建立唯一约束,指定3列组合【不允许同时重复】
CONSTRAINT uni UNIQUE(id, uname, pwd)
);
③修改表时,add【表级约束语法】
ALTER TABLE unique_test
ADD UNIQUE(id, uname, pwd);
④修改表时,modify【只能对单列采用列级约束】
ALTER TABLE unique_test
MODIFY id INT UNIQUE;
⑤删除约束
大部分数据库使用“drop constraint 约束名”,MySql使用“drop index 约束名”。
ALTER TABLE unique_test
DROP INDEX id;
3、PRIMARY KEY:列级、表级
主键约束等价于非空约束+唯一约束(不允许重复和null值)。
主键列的值可用于唯一标识表中的一条记录。
每个表最多一个主键,但主键约束可由多个数据列组合而成。
大部分数据库允许定义主键约束的名字,MySql出于保持与标准SQL的兼容性,允许命名,但这个名字没有任何作用,主键名依旧是PRIMARY。
主键约束与唯一约束语法非常相似,只是使用primary key。
①建表时-列级约束语法:
CREATE TABLE unique_test (id INT PRIMARY KEY);
②建表时-表级约束语法:
CREATE TABLE unique_test (
id INT,
uname VARCHAR(25),
#指定主键名对MySql无效,依旧是primary
CONSTRAINT myPrimary PRIMARY KEY(id),
#多列组合主键约束
#CONSTRAINT myPrimary PRIMARY KEY(id, uname)
);
②删除主键约束
ALTER TABLE unique_test DROP PRIMARY KEY;
③修改表时,add【表级约束语法】
ALTER TABLE unique_test
ADD PRIMARY KEY(id, uname, pwd);
④修改表时,modify【只能对单列采用列级约束】
ALTER TABLE unique_test
MODIFY id INT PRIMARY KEY;
自增长【整型】:auto_increment
CREATETABLE auto_inc_test (
id intauto_incrementPRIMARYKEY,
uname VARCHAR(25)
);
4、FOREIGN KEY:列级、表级
外键约束:保证一个或两个数据表之间的参照完整性,构建于一个表的两个字段或两个表的两个字段间的参照关系;
外键确保两相关字段的参照关系:子(从)表外键列的值必须在被参照列的值范围内,或为空(可自行增加非空约束);
删除:欲删除(被从表记录参照的)主表记录,必须先删除从表里参照该记录的所有记录;或删主表记录时级联删除从表中所有参照该记录的从表记录;
外键只能参照主表主键列或唯一键列;
一个表可有多个外键;
MySql也会为外键约束列建立索引;
用于实体间一对多<多的一端增加外键列>、一对一<任一方增加外键列,再增加唯一约束>的关联关系(多对多需额外增加一个连接表记录其关系);
①列级约束语法:REFERENCES 【出于保持与标准SQL的兼容性,实际无效,只能使用表级约束语法】
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR(25),
PRIMARY KEY(id)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
java_teacher INTREFERENCES teacher_table (id)
);
②表级约束语法:
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR (25),
PRIMARY KEY (id)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
java_teacher INT,
#constraint指定外键约束名
CONSTRAINT stu_tea_fk FOREIGN KEY(java_teacher)REFERENCES teacher_table (id)
);
MySql外键约束名默认为:table_name_ibfk_n,table_name是从表表名,n是从1开始的正数。
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR(25),
#必须以列组合建立主键
PRIMARYKEY(id, uname)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
java_teacher INT,
#CONSTRAINT指定外键约束名
CONSTRAINT stu_tea_fk FOREIGN KEY(java_teacher, stu_name)REFERENCES teacher_table (id, uname)
);
③删除外键约束:DROP
ALTER TABLE student_table
DROP FOREIGN KEY stu_tea_fk;
#stu_tea_fk为外键名
④增加外键约束:ADD FOREIGN KEY
ALTER TABLE student_table
ADD FOREIGN KEY(stu_id, stu_name)
REFERENCES teacher_table (id, uname);
⑤自关联:参照自身
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARYKEY,
stu_name VARCHAR(25),
refer_id INT,
CONSTRAINT stu_tea_fk FOREIGNKEY(refer_id)REFERENCES student_table (stu_id)
);
⑥级联删除:
ON DELETE CASCADE:删除主表时,从表记录全部级联删除;
ON DELETE SET NULL:删除主表时,参照该主表记录的外键设为null。
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR(25),
#必须以列组合建立主键
PRIMARY KEY(id, uname)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
#CONSTRAINT指定外键约束名
#定义级联删除
#亦可onDELETESETNULL
CONSTRAINT stu_tea_fk FOREIGNKEY(stu_id)REFERENCES teacher_table (id)ONDELETECASCADE
);
5、CHECK【MySql无效】
CREATE TABLE check_test (
id INT auto_increment,
uname VARCHAR(25),
PRIMARY KEY(id),
CHECK(id >10)
# 要求id>10
);
可借助MySql的触发机制来实现CHENCK约束,甚至更复杂的完整性约束。
在表上强制执行的数据校验规则,保证数据库里数据的完整性。当表中数据相互依赖时,保证相关数据不被删除。
也是数据库对象,也有自己的名字。
约束通常无法修改。
大部分数据库支持一下5种约束:
NOT NULL:非空约束,指定某列不能为空;
UNIQUE:唯一约束,指定某列或几列组合的数据不能重复;
PRIMARY KEY:主键,指定该列的值可以唯一地标识该条记录;
FOREIGN KEY:外键,指定改行记录从属于主表中的一条记录,主要用于保证参照完整性;
CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。
MySQL不支持CHECK约束(可以使用,但没有任何作用)。
约束分类:
①单列约束;②多列约束(可约束多个数据列)。
约束时机:
建表同时为相应数据列指定约束;
建表后创建,以修改表的方式增加约束。
列级约束语法、表级约束语法。
Note:
MySQL使用information_schema数据库的TABLE_CONSTRAINTS表保存该数据库实例的所有约束信息,可通过该表查询。
SQL中的null:
不区分大小写;所有类型均可以为null(包括int、boolean);空字符串和0不等于null。
1、NOT NULL:列级
有not null当然也有null。
①建表指定:
CREATE TABLE person (
id INT NOT NULL,
age VARCHAR(2)NULL
)
②alter修改表时增删:
ALTER TABLE person
#增加非空约束
MODIFY username VARCHAR(10)NO
TNULL,
#取消非空约束
MODIFY age INT NULL,
#取消非空约束,并指定默认值
MODIFY grade INT DEFAULT 99 NULL;
2、UNIQUE:列级、表级
列不可以出现重复值,null除外(数据库中null不等于null)。
单列:使用列级约束语法【第一约束名即为字段名,其他加序号,如id_2】
CREATE TABLE unique_test (id INT UNIQUE);
多列、自行指定约束名:使用表级约束语法【格式:constraint 约束名 约束定义】
①建表时-分别建立唯一约束:
CREATE TABLE unique_test (
#非空约束
id INT NOT NULL,
uname VARCHAR(25),
pwd VARCHAR(25),
#表级约束语法建立唯一约束
UNIQUE(uname),
#表级约束语法建立唯一约束,并指定约束名uni
CONSTRAINT uni UNIQUE(pwd)
);
②建表时-列组合建立唯一约束:
CREATE TABLE unique_test (
#非空约束
id INTNOTNULL,
uname VARCHAR(25),
pwd VARCHAR(25),
#表级约束语法建立唯一约束,指定3列组合【不允许同时重复】
CONSTRAINT uni UNIQUE(id, uname, pwd)
);
③修改表时,add【表级约束语法】
ALTER TABLE unique_test
ADD UNIQUE(id, uname, pwd);
④修改表时,modify【只能对单列采用列级约束】
ALTER TABLE unique_test
MODIFY id INT UNIQUE;
⑤删除约束
大部分数据库使用“drop constraint 约束名”,MySql使用“drop index 约束名”。
ALTER TABLE unique_test
DROP INDEX id;
3、PRIMARY KEY:列级、表级
主键约束等价于非空约束+唯一约束(不允许重复和null值)。
主键列的值可用于唯一标识表中的一条记录。
每个表最多一个主键,但主键约束可由多个数据列组合而成。
大部分数据库允许定义主键约束的名字,MySql出于保持与标准SQL的兼容性,允许命名,但这个名字没有任何作用,主键名依旧是PRIMARY。
主键约束与唯一约束语法非常相似,只是使用primary key。
①建表时-列级约束语法:
CREATE TABLE unique_test (id INT PRIMARY KEY);
②建表时-表级约束语法:
CREATE TABLE unique_test (
id INT,
uname VARCHAR(25),
#指定主键名对MySql无效,依旧是primary
CONSTRAINT myPrimary PRIMARY KEY(id),
#多列组合主键约束
#CONSTRAINT myPrimary PRIMARY KEY(id, uname)
);
②删除主键约束
ALTER TABLE unique_test DROP PRIMARY KEY;
③修改表时,add【表级约束语法】
ALTER TABLE unique_test
ADD PRIMARY KEY(id, uname, pwd);
④修改表时,modify【只能对单列采用列级约束】
ALTER TABLE unique_test
MODIFY id INT PRIMARY KEY;
自增长【整型】:auto_increment
CREATETABLE auto_inc_test (
id intauto_incrementPRIMARYKEY,
uname VARCHAR(25)
);
4、FOREIGN KEY:列级、表级
外键约束:保证一个或两个数据表之间的参照完整性,构建于一个表的两个字段或两个表的两个字段间的参照关系;
外键确保两相关字段的参照关系:子(从)表外键列的值必须在被参照列的值范围内,或为空(可自行增加非空约束);
删除:欲删除(被从表记录参照的)主表记录,必须先删除从表里参照该记录的所有记录;或删主表记录时级联删除从表中所有参照该记录的从表记录;
外键只能参照主表主键列或唯一键列;
一个表可有多个外键;
MySql也会为外键约束列建立索引;
用于实体间一对多<多的一端增加外键列>、一对一<任一方增加外键列,再增加唯一约束>的关联关系(多对多需额外增加一个连接表记录其关系);
①列级约束语法:REFERENCES 【出于保持与标准SQL的兼容性,实际无效,只能使用表级约束语法】
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR(25),
PRIMARY KEY(id)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
java_teacher INTREFERENCES teacher_table (id)
);
②表级约束语法:
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR (25),
PRIMARY KEY (id)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
java_teacher INT,
#constraint指定外键约束名
CONSTRAINT stu_tea_fk FOREIGN KEY(java_teacher)REFERENCES teacher_table (id)
);
MySql外键约束名默认为:table_name_ibfk_n,table_name是从表表名,n是从1开始的正数。
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR(25),
#必须以列组合建立主键
PRIMARYKEY(id, uname)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
java_teacher INT,
#CONSTRAINT指定外键约束名
CONSTRAINT stu_tea_fk FOREIGN KEY(java_teacher, stu_name)REFERENCES teacher_table (id, uname)
);
③删除外键约束:DROP
ALTER TABLE student_table
DROP FOREIGN KEY stu_tea_fk;
#stu_tea_fk为外键名
④增加外键约束:ADD FOREIGN KEY
ALTER TABLE student_table
ADD FOREIGN KEY(stu_id, stu_name)
REFERENCES teacher_table (id, uname);
⑤自关联:参照自身
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARYKEY,
stu_name VARCHAR(25),
refer_id INT,
CONSTRAINT stu_tea_fk FOREIGNKEY(refer_id)REFERENCES student_table (stu_id)
);
⑥级联删除:
ON DELETE CASCADE:删除主表时,从表记录全部级联删除;
ON DELETE SET NULL:删除主表时,参照该主表记录的外键设为null。
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR(25),
#必须以列组合建立主键
PRIMARY KEY(id, uname)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
#CONSTRAINT指定外键约束名
#定义级联删除
#亦可onDELETESETNULL
CONSTRAINT stu_tea_fk FOREIGNKEY(stu_id)REFERENCES teacher_table (id)ONDELETECASCADE
);
5、CHECK【MySql无效】
CREATE TABLE check_test (
id INT auto_increment,
uname VARCHAR(25),
PRIMARY KEY(id),
CHECK(id >10)
# 要求id>10
);
可借助MySql的触发机制来实现CHENCK约束,甚至更复杂的完整性约束。
欢迎个人转载,但须在文章页面明显位置给出原文连接; 未经作者同意必须保留此段声明、不得随意修改原文、不得用于商业用途,否则保留追究法律责任的权利。 【 CSDN 】:csdn.zxiaofan.com 【GitHub】:github.zxiaofan.com 如有任何问题,欢迎留言。祝君好运! Life is all about choices! 将来的你一定会感激现在拼命的自己!
相关文章推荐
- 1.SQL语句基础之DDL
- MySQL数据库读写分离
- Mysql存储引擎
- mysql转换引擎的方法
- Mysql读书笔记
- jdbc连接数据库
- 重启服务器后显示nginx error!以及vsftpd mysqladmin无法连接问题
- 《转》VMware vSphere 5.1 学习系列之四:安装 SQL Server 数据库
- Hive学习笔记(三) 创建数据库与表
- Redis主从复制配置
- [Mysql for Excel指南] 第三章 配置
- ORACLE--COUNT()函数使用
- case when then else end的用法
- redis sentinel 集群配置-主从切换
- 基于zookeeper和redis上的分布式锁
- 解决xampp mysql不能启动 问题
- MVC连接Sql Server数据库出现的小问题
- mysql中declare语句用法
- mysql游标使用
- SQL表连接查询(inner join、full join、left join、right join)