六个约束
目录
PRIMARY KEY约束
PRIMARY KEY约束又称主键约束,定义表中构成主键的一列或者多列。主键用于唯一标识表示每条记录,作为主键的字段值,不能为空且必须唯一。
一 、首先是教你如何创建主键约束
在 CREATE TABLE 语句中,主键是通过 PRIMARY KEY 关键字来指定。
语法create table 表名
(字段1 字段类型 PRIMARY KEY ,#-----设置它为主键,
字段2 字段类型 [comment 字段3注释], # [ ] 这个注释可以省略不写 但最好加上
字段3 字段3类型 [comment 字段3注释] #最后一个不需要,
);
select * from py_key;#查看表
另外一种就是在已创建好的表上添加主键
( Alter table 表名 drop primary key;)语句 删除表中的主键
然后重新输入
ALTER TABLE <数据表名> ADD PRIMARY KEY(<列名>); 小括号别忘记
ps:如果在ID内加入一个自增(AUTO_INCREMENT属性)的主键,想删除的话,要先将这个列的自动增长属性去掉,才可以删除主键。
# modify:只能用于修改字段的属性
alter table 表明 modify 字段 字段属性;
例如
表示 此列是自动增长列,无法直接删除
列的属性还带有AUTO_INCREMENT,那么要先将这个列的自动增长属性去掉,才可以删除主键
我们可以用 alter table 表明 modify 字段 字段属性; 修改他的自增属性,然后在删除主键
修改完之后还是存在主键,此时我们可以用,删除主键啦!
alter table pr_key drop primary key;
复合主键
1.问主键可不可以有多个?
答案是 NO, 主键本身不能有多个,但可以有多个列进入到主键当中。可以有多个列设置为主键,成为联合主键。
语句是:
create table pr_key
(
ID INT auto_increment comment '主键',#-----设置它为主键
IDcard int not null,
Name varchar(30) NOT NULL,
price DECIMAL(8, 2),
primary key (ID,IDcard) # 复合主键
);
联和主键
与复合主键不同,他常出现于多表之间的链接,而复合主键只体现在一个表中的多个字段间链接。
create table student01(
id int auto_increment comment '主键id',
name varchar(30) comment '姓名',
age smallint comment '年龄', # smallint 大小为 2bytes ,int/integer 为5 bytes
primary key(id)
)COMMENT '学生表';
create table course01(
id int auto_increment comment '主键id',
name varchar(30) comment '课程名称',
primary key(id)
)comment '课程表';
create table stu_cour01(
id int auto_increment comment '主键id',
stu_id mediumint comment '学生表id',#mediumint 3(24bit) 加上unsigned/zerofill:8
cour_id mediumint comment '课程表id', # 不加unsigned/zerofill:9
primary key(id)
)comment '学生课程表';
摘抄CSDN博主「迷你酷吧」的文章的一句话 觉得很好
原文链接:https://blog.csdn.net/weixin_43381988/article/details/119733989
此时stu_course01中id就表示联合主键,通过id可以获取学生和课程的一条记录所以联合主键,顾名思义就是多个主键联合形成一个主键组合,体现在联合。 (主键原则上是唯一的,别被唯一值所困扰) 索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。 简单的例子 主键A跟主键B组成联合主键C,主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键C是唯一的。
NOT NULL 约束
非空约束(NOT NULL):指定字段不能为空
创建表时设置非空约束
CREATE TABLE <数据表名>
(
字段1,字段属性 PRIMARY KEY; #如果设置主键就不用设置NOT NULL ,因为主键本身就有非空的属性
字段2,字段属性 NOT NULL;
···
);
给表中添加非空约束
ALTER TABLE <数据表名> CHANGE COLUMN <旧字段名> <新字段名> <数据类型> NOT NULL;
例如
修改 列的名字 列类型的变更 change column
ALTER TABLE pr_key CHANGE COLUMN price price decimal NOT NULL;
DEFAULT 约束
UNIQUE 约束
作用:通常用于用户名,可以防止用户名重复的情况出现。
需要注意的是unique可以有多个且设置唯一约束的列允许有空值,但是只能有一个空值。
语句 :
CREATE TABLE 表明(
字段名 字段属性 PRIMARY KEY AUTO_INCREMENT COMMENT'',
字段名 字段属性 not null unique
) ;
例句:
CREATE TABLE users(
uID int(11) PRIMARY KEY AUTO_INCREMENT COMMENT '用户名',
uName varchar(30) NOT NULL UNIQUE,----定义为唯一约束
uPwd varchat(30) not null,
uSex ENUM('男','女')DEFAULT '男'
);
增加/删除 UNIQUE 约束
ALTER TABLE <数据表名> ADD CONSTRAINT <字段名> UNIQUE(<列名>);
ALTER TABLE <数据表名> DROP CONSTRAINT <唯一约束名 / 字段名>;
CHECK 约束
FOREIGN KEY 外键约束:
了解它的语句:
foreign key (子表的字段) references 父表名称(父表字段给) on delete cascade on update cascade
#NO ACTION 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 RESTRICT一致)
#RESTRICT 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。
(与 NO ACTION 一致)
#ASCADE 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
#SET NULL 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为nul (这就要求该外键允许取nul)
#SET DEFAULT 父表有变更时,子表将外键列设置成一个默认的值(innodb不支持)
添加外键表有2种方式
一个是创建表时添加
CREATE TABLE 表明(
字段名 数据类型,
····
FOREIGN KEY (外键字段名) 主表(主表列名)
);
第2中方法就是在已创建好的表中添加
ALRER TABLE 表明 ADD CONSTRAINT 外键名
FOREIGN KEY(外键字段民) REFERENCES 主表(主表字段);
注意如果报出 1822 的错误
原因:作为被引用的外键,它必须是唯一值,因此得添加约束unique或者primary key.