数据库约束

约束

    对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。 

约束种类:

PRIMARY KEY : 主键
UNIQUE : 唯一
NOT NULL : 非空
DEFAULT : 默认
FOREIGN KEY : 外键

主键

作用

用来唯一标识一条记录,每个表都应该有一个主键,并且每个表只能有一个主键。
有些记录的 name,age,score 字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样就不方便管理数据
通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。
主键 是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。

创建主键

主键: PRIMARY KEY
主键的特点:
主键必须包含唯一的值
主键列不能包含NULL值

创建主键方式:

  1. 在创建表的时候给字段添加主键 字段名 字段类型
    PRIMARY KEY
  2. 在已有表中添加主键
    ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
    3.创建表时,在constraint区域添加约束 –> 最后一个字段
    [constraint 约束名] primary key(列名)

联合主键

alter table 表名 add primary key(字段名1,字段名2);
–> 此时表中也只用一个主键
–> 多个列共同组成一个主键
–> 联合主键必须所有列必须完全相同

具体操作:
创建表学生表st5, 包含字段(id, name, age)将id做为主键

CREATE TABLE st5 (
id INT PRIMARY KEY, ‐‐ id是主键
NAME VARCHAR(20),
age INT );

添加数据

INSERT INTO st5 (
id, NAME) VALUES (1, ‘唐伯虎’);
INSERT INTO st5 (
id, NAME) VALUES (2, ‘周文宾’);
INSERT INTO st5 (
id, NAME) VALUES (3, ‘祝枝山’);
INSERT INTO st5 (
id, NAME) VALUES (4, ‘文征明’);

插入重复的主键值

‐‐ 主键是唯一的不能重复:Duplicate entry ‘1’ for key ‘PRIMARY’
INSERT INTO st5 (id, NAME) VALUES (1, ‘文征明2’);

插入NULL的主键值

‐‐ 主键是不能为空的:Column ‘id’ cannot be null
INSERT INTO st5 (id, NAME) VALUES (NULL, ‘文征明3’);

删除主键

ALTER TABLE 表名 DROP PRIMARY KEY;

具体操作:

删除st5表的主键
ALTER TABLE st5 DROP PRIMARY KEY;

外键约束

什么是外键约束

一张表中的某个字段引用另一个表的主键
主表: 约束别人
副表/从表: 使用别人的数据,被别人约束

创建外键

1. 新建表时增加外键:

[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)

关键字解释:

CONSTRAINT – 约束关键字
FOREIGN KEY(外键字段名) –- 某个字段作为外键
REFERENCES – 主表名(主键字段名) 表示参照主表中的某个字段

2. 已有表增加外键:

ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段 名);

注意:

若从表添加的外键数据没有主表主键,则添加失败
若从表添加外键数据是null,可以添加

作用:

保证数据的完整性

物理外键:

手动添加的foreign key
好处:保证数据的完整性
缺点:限制性强,不灵活

逻辑外键

不需手动添加foreign key ,只需让两个表的字段产生逻辑上的关联关系
好处:灵活
缺点:在数据库中不能保证数据的完整性

删除外键(了解)

ALTER TABLE 从表 drop foreign key 外键名称;
注意
若主表数据的主键被从表使用,则无法删除

具体操作:
删除employee表的emp_depid_ref_dep_id_fk外键
ALTER TABLE employee DROP FOREIGN KEY emp_depid_ref_dep_id_fk;
在employee表情存在况下添加外键
ALTER TABLE employee ADD CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id);

其他约束

自增

AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)

具体操作:

创建学生表st6, 包含字段(id, name, age)将id做为主键并自动增长

CREATE TABLE st6 (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT);

插入数据

‐‐ 主键默认从1开始自动增长
INSERT INTO st6 (NAME, age) VALUES (‘唐僧’, 22);
INSERT INTO st6 (NAME, age) VALUES (‘孙悟空’, 26);
INSERT INTO st6 (NAME, age) VALUES (‘猪八戒’, 25);
INSERT INTO st6 (NAME, age) VALUES (‘沙僧’, 20);

扩展

默认地AUTO_INCREMENT 的开始值是1
若期间指定主键的值,其后未指定的话,在新指定的主键基础上自增
如果希望修改起始值,请使用下列

SQL语法

ALTER TABLE 表名 AUTO_INCREMENT=起始值;

DELETE和TRUNCATE的区别
DELETE 删除表中的数据,但不重置AUTO_INCREMENT的值。
TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1

唯一

在这张表中这个字段的值不能重复

唯一约束的基本格式

1.创建表时

字段名 字段类型 UNIQUE;
–> 保证某一列的值唯一,不能重复

2.创建表时在constraint区域添加

[constraint 约束名] QNIQUE(列名);

3.创建表之后

alter table 表名 add [constraint 约束名] unique (列名)
删除约束
alter table 表名 drop index 约束名

实现唯一约束

具体步骤:

创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生
CREATE TABLE st7 ( id INT, NAME VARCHAR(20) UNIQUE );
添加一个学生
INSERT INTO st7 VALUES (1, ‘貂蝉’);
INSERT INTO st7 VALUES (2, ‘西施’);
INSERT INTO st7 VALUES (3, ‘王昭君’);
INSERT INTO st7 VALUES (4, ‘杨玉环’);
‐‐ 插入相同的名字出现name重复: Duplicate entry ‘貂蝉’ for key ‘name’
INSERT INTO st7 VALUES (5, ‘貂蝉’);
‐‐ 出现多个null的时候会怎样?因为null是没有值,所以不存在重复的问题
INSERT INTO st3 VALUES (5, NULL);
INSERT INTO st3 VALUES (6, NULL);

唯一和主键的区别

1.唯一约束可以是null,但主键不能
2.一个表中可以有多个唯一约束,但主键只能有一个

非空

这个字段必须设置值,不能是NULL,但可以是”;

非空约束的基本语法格式

1.字段名 字段类型 NOT NULL –> 创建表时
2.alter table 表名 modify 字段名 数据类型(长度) NOT NULL –> 创建表后

删除非空约束语法格式

alter table 表名 modify 字段名 数据类型(长度)
具体操作:
创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL
CREATE TABLE st8 ( id INT, NAME VARCHAR(20) NOT NULL, gender CHAR(2) );
添加一条完整的记录
INSERT INTO st8 VALUES (1, ‘郭富城’, ‘男’);
INSERT INTO st8 VALUES (2, ‘黎明’, ‘男’);
INSERT INTO st8 VALUES (3, ‘张学友’, ‘男’);
INSERT INTO st8 VALUES (4, ‘刘德华’, ‘男’);
‐‐ 姓名不赋值出现姓名不能为null: Column ‘name’ cannot be null
INSERT INTO st8 VALUES (5, NULL, ‘男’);

默认值

往表中添加数据时,如果不指定这个字段的数据,就使用默认值

默认值格式

字段名 字段类型 DEFAULT 默认值

具体步骤:

创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州
CREATE TABLE st9 ( id INT, NAME VARCHAR(20), address VARCHAR(50) DEFAULT ‘广州’ );
添加一条记录,使用默认地址
INSERT INTO st9 (id, NAME) VALUES (1, ‘刘德华’);
添加一条记录,不使用默认地址
INSERT INTO st9 VALUES (2, ‘张学友’, ‘香港’);

疑问:如果一个字段设置了非空与唯一约束,该字段与主键的区别

一张表中只有一个字段可以设置为主键
一张表中可以多个字段非空与唯一约束
主键可以自动增长,非空与唯一约束的字段不能自动增长

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值