文章目录
- 约束
- 约束的分类:
- 按照约束的作用效果不同
- 唯一约束
- 主键约束
- 外键约束
- 检查约束
- 非空约束
- 默认值约束
- 按照是否跟随列和字段属性来创建约束
- 行级约束
- 表级约束
- 创建约束
- 创建唯一约束
- 创建完表之后创建唯一约束
- 创建表的同时创建唯一约束
- 行级约束
- 表级约束
- 创建主键约束
- 创建完表之后创建主键约束
- 创建表的同时添加主键约束
- 行级约束
- 表级约束
- 创建外键约束
- 创建完表之后创建外键约束
- 创建表的同时创建外键约束
- 行级约束
- 表级约束
- 创建检查约束
- 创建完表之后添加检查约束
- 创建表的同时添加检查约束
- 行级约束
- 表级约束
- 非空约束
- 创建完表之后添加非空约束
- 创建表的同时添加非空约束
- 行级约束
- 默认值约束
- 创建完表之后添加默认值
- 创建表的同时添加默认值
- 删除约束
约束
CONSTRAINT
作用:作用在表中,让你的表按照约束条件和规则录入数据,让表更符合实际
约束的分类:
按照约束的作用效果不同
唯一约束
UNIQUE
作用:该字段插入的数据唯一,不能重复,可以为空
主键约束
PRIMARY KEY
作用:该字段不能重复而且不能为空
外键约束
FOREIGN KEY
作用:该字段数据的取值来自于另一张表的某字段
检查约束
CHECK
作用:是根据实际需求自定义约束内容
非空约束
NOT NULL
作用:该字段不能有空值
默认值约束
DEFAULT
作用:该字段不插入数据的时候,会自动填入默认值
按照是否跟随列和字段属性来创建约束
行级约束
在建表的同时,仅跟随字段和字段属性来声明约束,这就叫行级约束
CREATE TABLE 表名(列名1 字段属性 约束,列名2 字段属性......)
是指在列名后添加约束,为行级约束
表级约束
在建表的同时,声明所有字段和字段属性后,再单独声明约束
CREATE TABLE 表名(列名1 字段属性,
列名2 字段属性,
....,
约束)
创建约束
创建唯一约束
创建完表之后创建唯一约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列名1,列名2.....)
注意:如果括号内两个字段添加了一个唯一约束,即两个字段都相同才算重复,如ename,job字段,都是SMITH跟MANAGER才算重复,SMITH跟ANALYSE不算重复
ALTER TABLE Heih ADD CONSTRAINT un_HeiH_xingming UNIQUE (ename)
注意:
1.唯一约束约束不了空值
2.当有违反约束的数据村则,则创建约束会失败
创建表的同时创建唯一约束
行级约束
CREATE TABLE 表名 (列名1 字段属性 UNIQUE, ---给列名1添加唯一约束
列名2 字段属性........)
UNIQUE跟在哪个字段后面,就约束谁
约束名自动分配
如果想自己取名
CREATE TABLE 表名 (列名1 字段属性 CONSTRAINT 约束名 UNIQUE, ---给列名1添加唯一约束
列名2 字段属性........)
如此可以自己取约束名
表级约束
语法:
CREATE TABLE 表名(列名1 字段属性
,列名2 字段属性
,..........
,CONSTRAINT 约束名 UNIQUE (列名1,列名2,列名3,.....))
创建主键约束
创建完表之后创建主键约束
主键约束:PRIMARY KEY
该列不能为空也不能重复
Alter TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (列名...)
在同一个字段不能有作用相同的约束,如某个字段有唯一约束,则该字段不能添加主键约束,因为二者作用都有不能重复的作用
主键一般都是表里的唯一标识
创建表的同时添加主键约束
行级约束
CREATE TABLE 表名(列名1 字段属性 [CONSTRAINT 约束名] PRIMARY KEY
,列名2 字段属性
,......)
同样,约束名为系统分配
表级约束
CREATE TABLE 表名(列名1 字段属性
,列名2 字段属性
,..........
,CONSTRAINT 约束名 PRIMARY KEY (列名1,列名2,列名3,.....))
注意:每张表只能有一个主键约束
创建外键约束
创建完表之后创建外键约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY (列名) REFERENCES 父表(主键列或者唯一列)
如果表中已有数据,并且表中添加外键约束的列在父表中找不到相应的值,会报错
插入值的时候,添加外键约束的列同样应为父表列中的值,否则会报错。
注意:
1.外键约束约束不了空值,空值是可以随便添加的。
2.NO action:代表当子表有记录的时候,父表不能删除
3.CASCADE: 当子表有记录的时候,父表和子表一同删除
3.Set Null:当子表 有记录的时候,删除父表,子表变空值
外键很麻烦,所以很少用,甚至禁止使用
创建表的同时创建外键约束
行级约束
CREATE TABLE 表名(列名1 字段属性 [CONSTRAINT 约束名] REFERENCES 父表(主键列或者唯一列)
,列名2 字段属性
,.......)
表级约束
CREATE TABLE 表名(列名1 字段属性
,列名2 字段属性
,.......
, [CONSTRAINT 约束名] FORRIGN KEY (列名)
REFERENCES 父表(主键列或者唯一列)
)
创建检查约束
创建完表之后添加检查约束
语法:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK(条件1 AND 条件2 AND.....)
创建表的同时添加检查约束
行级约束
CREATE TABLE 表名(列名1 字段属性 [CONSTRAINT 约束名] CHECK(条件1 AND 条件2 AND.....OR .....) --条件只能引用列名1,不能写列名2,只能列名1怎样怎样
,列名2 字段属性
,......)
表级约束
CREATE TABLE 表名(列名1 字段属性
,列名2 字段属性
,......
,[CONSTRAINT 约束名] CHECK(条件1 AND 条件2 AND.....OR .....) --可以引用列名1列名2啊之类
非空约束
NOT NULL
其实算不上约束,放到这边来记
作用:该列不能有空值
创建完表之后添加非空约束
ALTER TABLE 表名 MODIFY 列名 NOT NULL
创建表的同时添加非空约束
行级约束
CREATE TABLE 表名 (列名1 字段属性 NOT NULL
,列名2 字段属性......)
没有表级约束
默认值约束
DEFAULT
作用,当该列没有插入数据时,默认填入一个值
创建完表之后添加默认值
ALTER TABLE 表名 MODIFY 列名 DEFAULT 值;
仍然可以特意去添加空值。
创建表的同时添加默认值
CREATE TABLE 表名(列名1 字段属性 DEFAULT 值
,列名2 字段属性....)
没有表级写法
删除约束
1.前四个:
ALTER TABLE 表名 DROP CONSTRAINT 约束名;
2.删除非空约束
ALTER TABLE 表名 MODIFY 列名 NULL;
3.删除默认值
ALTER TABLE 表名 MODIFY 列名 DEFAULT NULL;