MySQL(三)数据库的六种约束、表的关系、三大范式

您所在的位置:网站首页 sql的完整性约束有哪些内容 MySQL(三)数据库的六种约束、表的关系、三大范式

MySQL(三)数据库的六种约束、表的关系、三大范式

2024-07-11 13:50| 来源: 网络整理| 查看: 265

文章目录 数据库约束NOT NULL(非空约束)UNIQUE(唯一约束)DEFAULT(缺省约束)PRIMARY KEY(主键约束)AUTO_INCREMENT 自增FOREIGN KEY(外键约束)CHECK(检查约束) 表的设计表的关系一对一一对多多对多 三大范式第一范式第二范式第三范式

数据库约束

数据库中主要有六种约束

NOT NULL(非空约束) - 指示某列不能存储 NULL 值。UNIQUE(唯一约束) - 保证某列的每行必须有唯一的值。DEFAULT(缺省约束) - 规定没有给列赋值时的默认值。PRIMARY KEY(主键约束) - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。FOREIGN KEY(外键约束) - 保证一个表中的数据匹配另一个表中的值的参照完整性。CHECK(检查约束) - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。 NOT NULL(非空约束)

指示某列不能存储 NULL 值。

例如在这里对birth添加非空约束

create table student( id int, age int, name varchar(8), birth date NOT NULL, math decimal(10, 2), english decimal(10, 2) );

接着向其中插入数据,如果不给birth一个确定的值,就会导致插入失败

INSERT INTO student VALUES(6, 13, "马六", NULL, 85.9, 95.4); ERROR 1048 (23000): Column 'birth' cannot be null INSERT INTO student(id, age, name) values(3, 16, "李华"); ERROR 1364 (HY000): Field 'birth' doesn't have a default value

添加了非空约束后该列就不能为空,必须要给一个值

UNIQUE(唯一约束)

保证某列的每行必须有唯一的值,即对于添加了唯一约束的数据项不能有重复

//对id添加unique约束 create table student( id int UNIQUE, age int, name varchar(8), birth date, math decimal(10, 2), english decimal(10, 2) ); //插入第一条数据 INSERT INTO student VALUES(1, 11, "李华", 20200812, 76.5, 87.5); Query OK, 1 row affected (0.002 sec)//插入成功 //插入第二条数据,除了id与第一条相同,其他全都不同 INSERT INTO student VALUES(1, 15, "李梅", 20200813, 88.5, 90.5); ERROR 1062 (23000): Duplicate entry '1' for key 'id'//报错,id必须唯一,不能重复 DEFAULT(缺省约束)

规定没有给列赋值时的默认值。

//为math和english添加缺省约束,缺省值为60 create table student( id int, age int, name varchar(8), birth date, math decimal(10, 2) DEFAULT 60, english decimal(10, 2) DEFAULT 60 ); //插入数据,没有指定math和english INTO student(id, age, name) values(3, 16, "李华"); Query OK, 1 row affected (0.001 sec) select * from student; +------+------+--------+-------+-------+---------+ | id | age | name | birth | math | english | +------+------+--------+-------+-------+---------+ | 3 | 16 | 李华 | NULL | 60.00 | 60.00 | +------+------+--------+-------+-------+---------+ //没有指定时会被修改为默认值 PRIMARY KEY(主键约束)

NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

主键的特性即非空且唯一,如果在没有指定主键的时候,如果某一列具有非空且唯一的特性,他就会被暂定为主键,但是主键只能有一个。

//id为非空且唯一 create table student( id int NOT NULL UNIQUE, age int, name varchar(8), birth date, math decimal(10, 2), english decimal(10, 2) ); desc student;//可以看到id成为了主键 +---------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | age | int(11) | YES | | NULL | | | name | varchar(8) | YES | | NULL | | | birth | date | YES | | NULL | | | math | decimal(10,2) | YES | | NULL | | | english | decimal(10,2) | YES | | NULL | | +---------+---------------+------+-----+---------+-------+ //使用PRIMARY KEY DROP TABLE student; create table student( id int PRIMARY KEY, age int, name varchar(8), birth date, math decimal(10, 2), english decimal(10, 2) ); DESC student; +---------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | age | int(11) | YES | | NULL | | | name | varchar(8) | YES | | NULL | | | birth | date | YES | | NULL | | | math | decimal(10,2) | YES | | NULL | | | english | decimal(10,2) | YES | | NULL | | +---------+---------------+------+-----+---------+-------+

但是非空且唯一并不代表主键,主键只能有一个,而非空不唯一可以有多个,如果有多个非空不唯一,则只会有第一个是主键

//将id和name都设置为非空且唯一 DROP TABLE student; create table student( id int NOT NULL UNIQUE, age int, name varchar(8) NOT NULL UNIQUE, birth date, math decimal(10, 2), english decimal(10, 2) ); desc student;//id和name都是非空且唯一,但是只有id是主键 +---------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | age | int(11) | YES | | NULL | | | name | varchar(8) | NO | UNI | NULL | | | birth | date | YES | | NULL | | | math | decimal(10,2) | YES | | NULL | | | english | decimal(10,2) | YES | | NULL | | +---------+---------------+------+-----+---------+-------+

如果想要使用多个列共同作为主键,就得使用下面这种语法

//在末尾表明组合主键的列有哪些 create table student( id int, age int, name varchar(8), birth date, math decimal(10, 2), english decimal(10, 2), PRIMARY KEY(id, name) ); +---------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | age | int(11) | YES | | NULL | | | name | varchar(8) | NO | PRI | NULL | | | birth | date | YES | | NULL | | | math | decimal(10,2) | YES | | NULL | | | english | decimal(10,2) | YES | | NULL | | +---------+---------------+------+-----+---------+-------+ //不能直接在多个列后面加上PRIMARY KEY,那样的意思是创建多个主键,但是主键是唯一的,所以会报错 //错误写法 create table student( id int PRIMARY KEY, age int, name varchar(8) PRIMARY KEY, birth date, math decimal(10, 2), english decimal(10, 2) ); ERROR 1068 (42000): Multiple primary key defined//报错,定义了多个主键 AUTO_INCREMENT 自增

添加自增属性的项必须为数字,并且必须为主键,并且只有缺省的时候才会使用自增。

表中数据从1开始自增,每次为上一条记录的+1如果删除了表中数据,序号并不会重置,而是继续从删除的位置自增 create table student( id int PRIMARY KEY AUTO_INCREMENT, age int, name varchar(8), birth date, math decimal(10, 2), english decimal(10, 2) ); INSERT INTO student(age, name) values(14, "张三"); INSERT INTO student(age, name) values(16, "李四"); select * from student; +----+------+--------+-------+------+---------+ | id | age | name | birth | math | english | +----+------+--------+-------+------+---------+ | 1 | 14 | 张三 | NULL | NULL | NULL | | 2 | 16 | 李四 | NULL | NULL | NULL | +----+------+--------+-------+------+---------+ //接着删除前两条 DELETE FROM student WHERE id


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3