本文主要是介绍Mysql中设计数据表的过程解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My...
1.引言
数据库约束是确保数据完整性的关键机制,通过预定义的规则自动校验数据,避免人工检查的繁琐和潜在错误。约束作用于表的列上,确保数据的正确性和关联关系的有效性。以下是常见约束类型的详细说明及示例。
2.NOT NULL——制定某列不可以存储NULL值
用于禁止某列存储空值(NULL),强制字段为必填项。
先来看看不加约php束的学生表格所展示出来的信息:
desc student;
当没有指定非空约束的时候,当前的列表示是可以写入一个NULL的值的,如果要把某一列定义为一个必填项,那么就可以使用not null来进行约束。示例如下:
CREATE TABLE student( id BIGINT not NULL, name VARCHAR(50) );
如图所示这个NO就表示当前列(id列)不能为空
下面我们插入一条为空的id数据试试:
INSERT into student VALUES(NULL,'张三');
写入这条数据的时候会报错,提示不可写入null的数值,这里数据库就帮我们进行了一次校验。
INSERT INTO student VALUES(1,'张三');
当我们写入一条id列不为空的数据的时候,就可以正常写入这条数据
2.UNIQUE——保证某一列的每一行必须有唯一的数值
确保某列的数值在表中唯一,适用于如学号、身份证号等场景。
我们首先来看一下不加唯一约束的时候的情况:
可见这出现了编号相同但是人名不一致的情况,这种情况不符合逻辑。如何解决这一问题呢?
UNIQUE这一约束条件就应运而生了
下面我们来看一下如何创建一个在id字段加唯一约束的表:
CREATE TABLE student( id BIGINT UNIQUE, name VARCHAR(50) );
由上图可见id的Key有一个UNI的标识,这就表示唯一约束
这时如果我们再插入两个一样的id数据就会报错,错误信息如下:
需要注意的是NULL可以重复插入,并不会报错
3. DEFAULT——规定没有给列赋值时的默认值
用于为列指定默认值,当插入数据未显式赋值时自动填充。
INSERT INTO student (id) VALUES(2);
如果我们不指定name的默认值就会出现这样的情况,显然这种情况也是不合理的
下面我们就来创建一个给name列设置默认值的一个数据表
CREATE TABLE student( id BIGINT UNIQUE, NAME VARCHAR(50) DEFAULT '无名氏' );
这个Default无名氏就是我们指定的默认值
Null列表示当前列是否可以为空
Key表示数据行的键值(标识)
Extra标识扩展信息 javascript;
下面我们来演示一下只指定了id会出现什么情况:
INSERT INTO student (id) VALUES(2);
由此可见这时的name就用默认值进行填充了
下面我们来思考这样一个问题:如果我们给name列设置为NULL会出现什么情况呢?
INSERT INTO student VALUES(3,NULL);
由此可见,虽然我们已经指定了默认约束,但是当我们手动指定这一列的值为NULL的时候,插入的值依旧是NULL,因为这个NULLL是我们自己手动指定的,也可以理解为:用户指定的优先级要高于默认约束。
于是我们可以得到这样一个结论:
当我们为某一列设置了默认约束的时候,如果不给这个列指定值才会使用默认约束。
4.PRIMARY KEY ——NOT NULL和UNIQUE的结合
确保某列(或者两个列多个列的结合)有唯一标识,有助于更容易快速找到表中的一个特定记录。
主键是 NOT NULL 和 UNIQUE的结合,用于唯一标识记录。
下面我们首先来演示一下如何把某一列的值约束为非空且唯一的:
CREATE TABLE student( -- 下面这个就把id设置为了 不为空 并且唯一 注意: not null 和unique之间不能有, 直接空格就行 id BIGINT not NULL UNIQUE, sn int UNIQUE, name VARCHAR(50) DEFAULT '无名氏' );
由上图可见这个id的Key列中被标识为了一个PRI,表示他是一个主键
我们在写入数据的时候这两个约束是同时生效的:
CREATE TABLE student( id BIGINT PRIMARY KEY AUTO_INCREMENT, sn int UNIQUE, name VARCHAR(20) DEFAULT '无名氏' );
这个id列的Extro的AUTO_INCREMENT表示自增类型,意为在当前表中上一条记录的基本上+1即可
这样设计的好处在于:让数据库去帮助我们维护主键的增长,不用自己去计算了,在插入数值的时候先找到最大的值,然后在这个基础上+1生成一个新的值,从而作为一个数据行主键(也就是id列)的值。
4.1全列插入演示
在写入数据的时候,我们不具体指定主键列的值,而是用NULL代替
INSERT INTO student VALUES(null,1001,'张三'); INSERT INTO student VALUES(null,1002,'李四'); SELECT* FROM student;
由此可见:
当设置了自增主键之后,写入null的时候,也可以成功插入数据。这里并不是说把这个null写入数据库了,而是说数据库帮我们去处理这个列中的数值(进行自增操作
4.2指定列插入演示
INSERT INTO student(sn,name) VALUES(1003,'王五'),(1004,'赵六'); SELECT* FROM student;
由此可见当我们进行指定列插入的时候,也会自动生成id,作为该数据行的主键 。
下面我们思考这样一个问题:我们可不可以指定一个主键值呢?
时间是检验真理的唯一标准,接下来我们就手动指定来看看吧~
INSERT INTO student VALUES(100,1010,'钱七'); SELECT* FROM student;
由此可见这个操作是可以的,只要主键值不重复即可
我们在这个基础之上再插入一条不指定id的数据试试,在这之前我们可以思考一下 这条新数据的id数值是多少呢?
INSERT INTO student(sn,name) VALUES(1011,'王二');
由此可见这个id的值是在原先数据表中id的最大值的基础上加1,由此可见主键在数据表中有可能不是连续的
4.3一个表中不允许有两个主键
CREATE TABLE test111( id BIGINT PRIMARY KEY, sn BIGINT PRIMARY KEY );
由上可见一个表中不可以同时设置两个主键,这样会报错。
但是一个主键可以同时包含多个列(复合主键)
下面我们就来演示一下复合主键:
CREATE TABLE stu1( id BIGINT, NAME VARCHAR(20), mail VARCHAR(50), PRIMARY KEY (id,name) ); DESC stu1;
由上图可知 id 和name的Key都有PRI 这就表示当前的表定义了复合主键,
复合主键在进行唯一校验的时候,只有复合主键中所有的列都相同才被判定为相同
下面我们通过例子来证实这一说法:
INSERT INTO stu1 VALUES(1,'张三','zs.com'); SELECT* FROM stu1;
下面我们再写入一条和这个一样的数据,看看会发生什么现象:
INSERT INTO stu1 values(1,'张三','zs.com');
报错了,那就证明这条数据是不可以pOfadpvCg写入的,因为他和前面一条数据完全一致。
下面我们尝试一下id一样,name不一样是否可以成功写入呢?
INSERT INTO stu1 VALUES(1,'李四','ls.com'); SELECT* FROM stu1;
由此可见这条数据虽然id和前面张三的id一样,但是姓名不同,因此这条数据是可以插入成功的
5.FOREIGN KEY——保证一个表中的数据匹配另一个表中的值的参照完整性
用于维护表间的参照完整性,确保子表字段匹配主表的主键或唯一键。
我们先创建一个学生表和一个班级表,展示如下:
学生表的class_id一列的编号和班级表的id编号是具备对应关系的,但是此时我们并没有进行设置外键约束,这时我们在学生表中插入一条数据,并且这个数据的class_id是不在班级表中存在的。
INSERT into student(name,class_id) VALUES('钱七',5);
由此可见这个操作是可以执行成功的,显然这个做法是不合理的,那么接下来我们引入:外键用于关联其他表的主键或唯一键
语法:foreign key(字段名) references 主表(列)
CREATE TABLE student( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) not NULL, class_id BIGINT, foreign KEY(class_id) REFERENCES class(id) );
foreign KEY表示创建外键的关键字
class_id表示php当前表中哪一个字段与主表建立主外键关系
REFERENCES:关键字,表示后面要引入哪个表的那个列
class(id):指定主表和相应的列
这个MUL就表示存在外键关系
这时我们插入正确的班级编号是可以的:
此时再插入不存在的班级编号:
这样就不行了
5.1问题:当子表中存在对主表的依赖的时候,能不能删除主表中相应的记录?
我们以删除班级编号为4为例:
这会报一个主外键的错误。
下面我们先删除子表中依赖班级4的数据,再删除主表中班级为4的数据:
DELETE FROM student WHERE class_id=4;android DELETE FROM class WHERE id=4; SELECT*from class;
由此我们可以得出以下结论:
如果要删除主表中的记录,那么子表中的数据不能对该条记录有依赖
也就意味着先要删除子表中的记录,再去删除主表中的记录
6.CHECK-保证列中的值符合指定的条件
用于限制列值的范围,仅允许符合条件的数据。
CREATE TABLE test_check( id BIGINT, gender VARCHAR(1), CHECK(gender='男' or gender='女') );
check为关键字
后面的gender表示要检查的列名=后面表示该列允许的值
下面我们执行这条语句:
INSERT into test_check VALUES(1,'无');
这样就报错了 因为‘无’并不在允许的值的范围之内。
总结
数据库约束通过自动化校验机制保障数据质量,减少人工干预的风险。合理使用 NOT NULL
、UNIQUE
、PRIMARY KEY
、FOREIGN KEY
和 CHECK
约束,能有效提升数据一致性和业务逻辑的严谨性。
到此这篇关于mysql中设计数据表的过程解析的文章就介绍到这了,更多相关mysql数据表设计内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于Mysql中设计数据表的过程解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!