数据库表的约束

数据库约束精讲
本文深入讲解数据库中的各种约束,包括主键、唯一、非空、外键及检查约束,探讨它们如何确保数据的正确性、有效性和完整性。通过实例演示主键的创建、自增特性,以及唯一、非空约束的应用,同时解析外键如何建立表间关系。

数据库约束的概述

约束的作用:
对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。

约束种类

约束名约束关键字
主键primary key
唯一unique
非空not null
外键foreign key
检查约束check 注:mysql不支持

主键约束

  • 主键的作用
    用来唯一标识数据库中的每一条记录

  • 哪个字段应该作为表的主键?
    通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行
    如:身份证,学号不建议做成主键

  • 创建主键
    主键关键字:primary key

  • 主键的特点:

    • 非空 not null
    • 唯一
  • 创建主键方式:

  1. 在创建表的时候给字段添加主键
    字段名 字段类型 PRIMARY KEY.
    -- 创建表学生表stu, 包含字段(id, name, age)将id做为主键
    create table stu (
    id int primary key, -- id为主键
    name varchar(20),
    age int
    )
    
  2. 在已有表中添加主键
    ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
    -- 删除stu表的主键
    alter table stu drop primary key;
    -- 添加主键
    alter table stu add primary key(id);
    
  • 主键自增
    主键如果让我们自己添加很有可能重复,通常希望在每次插入新记录时,数据库自动生成主键字段的值
    AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)

    • 修改自增长的默认值起始值
      默认地 AUTO_INCREMENT 的开始值是1,如果希望修改起始值,请使用下列SQL语法
      --创建表时指定起始值
      CREATE TABLE 表名(
      列名 int primary key AUTO_INCREMENT
      ) AUTO_INCREMENT=起始值;
      
      -- 指定起始值为1000
      create table st4 (
      id int primary key auto_increment,
      name varchar(20)
      ) auto_increment = 1000;
      
      ALTER TABLE 表名 AUTO_INCREMENT=起始值;
      alter table st4 auto_increment = 2000;
      
  • DELETE和TRUNCATE对自增长的影响

    • DELETE:删除所有的记录之后,自增长没有影响
    • TRUNCATE:删除以后,自增长又重新开始。

唯一约束

什么是唯一约束: 表中某一列不能出现重复的值
唯一约束的基本格式
字段名 字段类型 UNIQUE

-- 创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生
create table st7 (
id int,
name varchar(20) unique
)
-- 添加一个同名的学生
insert into st7 values (1, '张三');
select * from st7;
--错误描述: Duplicate entry '张三' for key 'name'
insert into st7 values (2, '张三');

-- 重复插入多个null会怎样?
insert into st7 values (2, null);
insert into st7 values (3, null);
null没有数据,不存在重复的问题

非空约束

  • 什么是非空约束: 某一列不能为null
  • 非空约束的基本语法格式:
    字段名 字段类型 NOT NULL
-- 创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL
create table st8 (
id int,
name varchar(20) not null,
gender char(1)
)
-- 添加一条记录其中姓名不赋值
insert into st8 values (1,'张三疯','男');
select * from st8;
-- error描述:Column 'name' cannot be null  
insert into st8 values (2,null,'男');
  • 默认值
    什么是默认值:
    字段名 字段类型 DEFAULT 默认值
-- 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州
create table st9 (
id int,
name varchar(20),
address varchar(20) default '广州'
)
-- 添加一条记录,使用默认地址
insert into st9 values (1, '李四', default);
select * from st9;
insert into st9 (id,name) values (2, '李白');
-- 添加一条记录,不使用默认地址
insert into st9 values (3, '李四光', '深圳');

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

  1. 主键数在一个表中,只能有一个。不能出现多个主键。 主键可以单列,也可以是多列
  2. 自增长只能用在主键上。

外键约束

foreign key:让表于表产生关系,从而保证数据的正确性。
单表问题:

  1. 数据冗余
  2. 后期还会出现增删改的问题
  • 什么是外键约束
    什么是外键:在从表中与主表主键对应的那一列,如:员工表中的dep_id
    主表: 一方,用来约束别人的表
    从表: 多方,被别人约束的表

  • 创建约束的语法

    • 新建表时增加外键:
    [CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)
    
    • 已有表增加外键:
    ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);
    
  • 删除外键

    ALTER TABLE 从表 drop foreign key 外键名称;
    
    -- 删除employee表的emp_depid_fk外键
    alter table employee drop foreign key emp_depid_fk;
    
    -- 在employee表情存在的情况下添加外键
    alter table employee add constraint emp_depid_fk
    foreign key (dep_id) references department(id);
    
  • 外键的级联

    • 什么是级联操作:
      在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作级联
级联操作语法描述
ON UPDATE CASCADE级联更新,只能是创建表的时候创建级联关系。更新主表中的主键,从表中的外键列也自动同步更新
ON DELETE CASCADE级联删除
-- 创建employee表,添加级联更新和级联删除
drop table employee;
create table employee(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int, -- 外键对应主表的主键
-- 创建外键约束  
添加表的级联操作  on update cascade on delete cascade(可以同时添加)
constraint emp_depid_fk foreign key (dep_id) references
department(id) on update cascade on delete cascade
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值