增城网站建设公司,网站服务器租,深圳产品网站建设,世安建设集团有限公司网站表的约束和基本查询 1.表的约束1.1 空属性1.2默认值1.3列描述1.4 zerofill1.5主键1.6 自增长1.7 唯一键1.8外键 1.表的约束
真正约束字段的是数据类型#xff0c;但是数据类型约束很单一#xff0c;
需要有一些额外的约束#xff0c;
更好的保证数据的合法性#xff0c;从… 表的约束和基本查询 1.表的约束1.1 空属性1.2默认值1.3列描述1.4 zerofill1.5主键1.6 自增长1.7 唯一键1.8外键 1.表的约束
真正约束字段的是数据类型但是数据类型约束很单一
需要有一些额外的约束
更好的保证数据的合法性从业务逻辑角度保证数据的正确性。
比如有一个字段是email要求是唯一的。
表的约束很多这里主要介绍如下几个null/not null,default, comment, zerofillprimarykeyauto_incrementunique key 。1.1 空属性
两个值null默认的和not null(不为空)数据库默认字段基本都是字段为空但是实际开发时尽可能保证字段不为空因为数据为空没办法参与运算
案例 创建一个班级表包含班级名和班级所在的教室。
站在正常的业务逻辑中
如果班级没有名字你不知道你在哪个班级如果教室名字可以为空就不知道在哪上课 所以我们在设计数据库表的时候一定要在表中进行限制满足上面条件的数据就不能插入到表中。这就是“约束”
创建表
mysql create table myclass(- class_name varchar(20) not null,- class_room varchar(10) not null);
Query OK, 0 rows affected (0.02 sec)插入数据
mysql insert into myclass(class_name) values(class1);结果
1.2默认值
默认值某一种数据会经常性的出现某个具体的值可以在一开始就指定好在需要真实数据的时候用户可以选择性的使用默认值。
创建表
CREATE TABLE tt10 (name varchar(20) not null,age tinyint unsigned default 0,sex char(2) default 男
);
insert into tt10(name) values(zhangsan);1.3列描述
列描述comment没有实际含义专门用来描述字段会根据表创建语句保存用来给程序员或DBA数据库管理员来进行了解。
ysql create table tt12 (- name varchar(20) not null comment 姓名,- age tinyint unsigned default 0 comment 年龄,- sex char(2) default 男 comment 性别- );--注意not null和defalut一般不需要同时出现因为default本身有默认值不会为空通过desc查看不到注释信息 通过desc查看不到注释信息
1.4 zerofill
mysql show create table tt3\G
***************** 1. row *****************Table: tt3
Create Table: CREATE TABLE tt3 (
a int(10) unsigned DEFAULT NULL,
b int(10) unsigned DEFAULT NULL
) ENGINEMyISAM DEFAULT CHARSETgbk
1 row in set (0.00 sec)可以看到int(10),这个代表什么意思呢整型不是4字节码这个10又代表什么呢其实没有zerofill这个属性括号内的数字是毫无意义的。a和b列就是前面插入的数据如下
mysql insert into tt3 values(1,2);
Query OK, 1 row affected (0.00 sec)
mysql select * from tt3;
------------
| a | b |
------------
| 1 | 2 |
------------但是对列添加了zerofill属性后显示的结果就有所不同了。修改tt3表的属性
mysql alter table tt3 change a a int(5) unsigned zerofill;
mysql show create table tt3\G
*************************** 1. row ***************************Table: tt3
Create Table: CREATE TABLE tt3 (
a int(5) unsigned zerofill DEFAULT NULL, --具有了zerofill
b int(10) unsigned DEFAULT NULL
) ENGINEMyISAM DEFAULT CHARSETgbk
1 row in set (0.00 sec)对a列添加了zerofill属性再进行查找返回如下结果
mysql select * from tt3;
-------------
| a | b |
-------------
| 00001 | 2 |
-------------这次可以看到a的值由原来的1变成00001这就是zerofill属性的作用如果宽度小于设定的宽度这里设置的是5自动填充0。要注意的是这只是最后显示的结果在MySQL中实际存储的还是1。为什么是这样呢我们可以用hex函数来证明
mysql select a, hex(a) from tt3;
---------------
| a | hex(a) |
---------------
| 00001 | 1 |
---------------可以看出数据库内部存储的还是1,00001只是设置了zerofill属性后的一种格式化输出而已。
1.5主键
主键primary key用来唯一的约束该字段里面的数据不能重复不能为空一张表中最多只能有一个主键主键所在的列通常是整数类型。
创建表时直接指定 主键约束 主键对应的字段中不能重复一旦重复操作失败。 当表创建好以后但是没有主键的时候可以再次追加主键
alter table 表名 add primary key(字段列表)删除主键
alter table 表名 drop primary key;复合主键 在创建表的时候在所有字段之后使用primary key(主键字段列表)来创建主键如果有多个字段作为主键可以使用复合主键。
复合主键只有所有主键相同时才会冲突
冲突
1.6 自增长
auto_increment当对应的字段不给值会自动的被系统触发系统会从当前字段中已经有的最大值1操作得到一个新的不同的值。通常和主键搭配使用作为逻辑主键。 自增长的特点:
任何一个字段要做自增长前提是本身是一个索引key一栏有值自增长字段必须是整数一张表最多只能有一个自增长 案例
1.7 唯一键
一张表中有往往有很多字段需要唯一性数据不能重复但是一张表中只能有一个主键唯一键就可以解决表中有多个字段需要唯一性约束的问题。 唯一键的本质和主键差不多唯一键允许为空而且可以多个为空空字段不做唯一性比较。 关于唯一键和主键的区别 我们可以简单理解成主键更多的是标识唯一性的。而唯一键更多的是保证在业务上不要和别的信息出现重复。乍一听好像没啥区别我们举一个例子 假设一个场景(当然具体可能并不是这样仅仅为了帮助大家理解) 比如在公司我们需要一个员工管理系统系统中有一个员工表员工表中有两列信息一个身份证号码一个是员工工号我们可以选择身份号码作为主键。 而我们设计员工工号的时候需要一种约束而所有的员工工号都不能重复。 具体指的是在公司的业务上不能重复我们设计表的时候需要这个约束那么就可以将员工工号设计成为唯一键。 一般而言我们建议将主键设计成为和当前业务无关的字段这样当业务调整的时候我们可以尽量不会对主键做过大的调整。 案例
mysql create table student (- id char(10) unique comment 学号不能重复但可以为空,- name varchar(10)- );
Query OK, 0 rows affected (0.01 sec)
mysql insert into student(id, name) values(01, aaa);
Query OK, 1 row affected (0.00 sec)
mysql insert into student(id, name) values(01, bbb); --唯一约束不能重复
ERROR 1062 (23000): Duplicate entry 01 for key id
mysql insert into student(id, name) values(null, bbb); -- 但可以为空
Query OK, 1 row affected (0.00 sec)
mysql select * from student;
------------
| id | name |
------------
| 01 | aaa |
| NULL | bbb |
------------1.8外键
用于定义主表和从表之间的关系外键约束主要定义在从表上主表则必须是有主键约束或unique约束。当定义外键后要求外键列数据必须在主表的主键列存在或为null。 语法 foreign key (字段名) references 主表(列)