美文网首页程序员
范式、外键与auto_increment使用

范式、外键与auto_increment使用

作者: 叫我老村长 | 来源:发表于2018-08-13 23:15 被阅读60次
about-BY-gentle.jpg

int(M) M表示的不是数据的最大长度,只是数据宽度,并不影响存储多少位长度的数据;

     varchar(M) M表示的是varchar类型数据在数据库中存储的最大长度,超过则不存;

auto_increment 可以设置自增
ALTER TABLE auto_increment=180470;


mysql> ALTER TABLE studentinfo auto_increment=180470;
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0

改charset同样
不要轻易去改,在做之前直接想好。

改auto_increment 步长:
会话级别:本次会话结束就没了。
会话级别的步长
查看当前的步长格式如下:

mysql> show session variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+
2 rows in set (0.04 sec)

查看步长。
全局级别:常有。
全局级别的步长

注:mysql> show create table studentinfo \G;
分行好看。

总结:
一个表,自增只能有一个,并且作为key。
报错:1075.
count(*) ;count(1); 1的效率比较快。

创建计算字段。

创建的字段原本不在表中。通过mysql运算得到结果,我们把得到的结果起一个别名,这个就是我们创建计算字段。

select CONCAT(student_name,student_id) as student_nums from

mysql> select CONCAT(student_name,student_id) as student_nums from studentinfo;
+-----------------+
| student_nums    |
+-----------------+
| xx180403        |
| 老黄180405      |
| 小环180406      |
| 小花花180407    |
| 小刚180408      |
| jim180409       |
| 小牛 180410     |
| 王二180411      |
| 端木横180412    |
| 金刚180413      |
+-----------------+
10 rows in set (0.00 sec)

select CONCAT(TRIM(student_name),student_id) as student_nums from studentinfo;
去掉左右空格   TRIM
去掉右面空格 RTRIM

加密函数

password
md5

条件判断函数

IF(age>30,age,0)
如果age>30 满足 返回age 负责0.

mysql> SELECT IF(age>30,age,0) FROM studentinfo;
+------------------+
| IF(age>30,age,0) |
+------------------+
|                0 |
|                0 |
|                0 |
|                0 |
|                0 |
|                0 |
|                0 |
|                0 |
|                0 |
|               99 |
+------------------+
10 rows in set (0.00 sec)

产生一个新字段了。where是筛选。

IFNULL(v1,v2)
if v1 not null,返回v1 否则返回v2.

mysql> select * from studentinfo WHERE phonenum is null;
+------------+--------------+-----+--------+----------+
| student_id | student_name | age | gender | phonenum |
+------------+--------------+-----+--------+----------+
|     180403 | xx           |  23 |      0 | NULL     |
|     180405 | 老黄         |  23 |      0 | NULL     |
|     180406 | 小环         |   6 |      0 | NULL     |
|     180407 | 小花花       |  22 |      0 | NULL     |
|     180408 | 小刚         |  20 |      0 | NULL     |
|     180410 | 小牛         |  25 |      0 | NULL     |
|     180411 | 王二         |  11 |      1 | NULL     |
|     180413 | 金刚         |  99 |      1 | NULL     |
+------------+--------------+-----+--------+----------+
8 rows in set (0.00 sec)
mysql> select ifNULL(phonenum,'22222') from studentinfo ;
+--------------------------+
| ifNULL(phonenum,'22222') |
+--------------------------+
| 22222                    |
| 22222                    |
| 22222                    |
| 22222                    |
| 22222                    |
| 16666666666              |
| 22222                    |
| 22222                    |
| 11111111                 |
| 22222                    |
+--------------------------+
10 rows in set (0.00 sec)

CASE value WHEN 条件 THEN 结果END
CASE WHEN 条件 THEN 结果1  ELSE 结果2 END 当遇到某种条件,当when后面条件满足,返回结果1,否则结果2.

mysql> select student_name,case when phonenum is null THEN '00000000' ELSE phonenum END from studentinfo;
+--------------+--------------------------------------------------------------+
| student_name | case when phonenum is null THEN '00000000' ELSE phonenum END |
+--------------+--------------------------------------------------------------+
| xx           | 00000000                                                     |
| 老黄         | 00000000                                                     |
| 小环         | 00000000                                                     |
| 小花花       | 00000000                                                     |
| 小刚         | 00000000                                                     |
| jim          | 16666666666                                                  |
| 小牛         | 00000000                                                     |
| 王二         | 00000000                                                     |
| 端木横       | 11111111                                                     |
| 金刚         | 00000000                                                     |
+--------------+--------------------------------------------------------------+
10 rows in set (0.00 sec)

数学函数,字符串函数,时间,日期。
举其中一个函数:

mysql> select abs(-5);
+---------+
| abs(-5) |
+---------+
|       5 |
+---------+
1 row in set (0.00 sec)

注:一个中文3个字符

实践中,通常把一个数据库分成两个或多个表并定义表之间的关系以做到数据隔离,添加、删除和修改某个字段只需要在一个表中进行,接着可以通过定义的关系传递到数据库中剩余的表中(和分层思想的意义所在很相似)。这样我们可以消除很多错误或垃圾数据出现的机会并减轻更新信息所必要的工作量。
事物往往具有多面性,设计范式也会带来一定的麻烦:操作困难,因为需要联系多个表才能得到所需要数据,而且范式越高性能就会越差。所以使用多高的范式需要权衡利弊,一般在项目中,使用到第三范式也就足够了,性能好而且方便管理数据。

三范式、E-R(关系对象模型)

第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
省份市分字段去写。不要都写在一个字段。
具体场景,具体对待,但是大部分要去靠。

第二范式(2NF):首先是 1NF,另外包含两部分内容,
一是表必须有一个主键(单个或者多个);
二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

主键默认不为空

订单必须包含二者确保唯一,订单id和商品id
范式好处:
1.单独可以分开用调
2.节省字节,不用继续写‘洗发水’,以后直接用。

第三范式(3NF):
首先是 2NF,
另外,非主键列,必须直接依赖于主键,不能存在传递依赖。
即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

E-R(关系对象模型)
数据库的相关知识点,数据库的三大特性可谓是:实体属性和关系。

E:Entry 实体。
每个表是一个类。类就是实体。

设计实体就像定义一个类一样,
指定从哪些方面描述对象,(员工的信息)
一个实体转换为数据库中的一个表(放员工信息)
总结:根据某一事物特征,添加信息描述,我们把信息描述添加到一个表,这个表就是实体。

R: Relationship 对应的关系
就是表与表之间的关系.
关系模型:
一对一:例子你的狗你养,个人信息和身份证。
个人信息表

create table user(
id int auto_increment,
name vacher(10),
primary key(id)
idvard int not null,
#外键
CONSTRAINT FK_IDCARD(起个外键名字,不起就有默认的) FOREIGH KEY(idvard)(哪个字段设为外键)  REFERENCES(参照哪个表)  tableid (id)(外部的)
FK是外键的名字,删除根据他。
);

链接二表的字段。
当前表外键必须为另一个个表的主键。

身份证表:
create tableid(
id int auto_increment,
idnum char(50),
name vacher(10),
primary key(id));

一对多:班级学生
create student(
id int auto_increment,
name char(20) not null,
primary key(id));

create cgrade(
id int auto_increment,
class_name char(20) not null,
class_desc varchar(255) not null,
class_student_num int default 0,
primary key(id));

多对多(中间做一个表,链接二者):选课

create student(
id int auto_increment,
name char(20) not null,
primary key(id));

create courese(
id int auto_increment,
name varchar(20) not null,
primary key(id));

逻辑删除(最后预留字段)
用户删除了,就不显示了。但是不在数据库删除。
isDelete int 0代表未删除 1代表删除,通过01查看是否显示。

1.首先要找表间关系
2.A班级表(id,name,主键为id)
3.B学生表 (id,name,主键为id,clsid(外键-->班级表中的主键))
创建学生表,必须要有班级表
创建班级表。


mysql> CREATE TABLE classes (
    -> id int auto_increment,
    -> name varchar(20) not null,
    -> isdelete int default 0,
    -> primary key(id)
    -> ))ENGINE=InnoDB DEFAULT CHARSET=utf8;
;

外键:
mysql> CREATE TABLE student(
    -> id int auto_increment,
    -> name varchar(20) not null,
    -> birthday DATE null,
    -> gender int default 0,
    -> clsid int,(建立外键字段,就是班级id)
    -> isdelete int default 0,
    -> primary key(id),
    -> CONSTRAINT FK_CLSID(外键名字) foreign key(clsid) (外键字段)references classes(表名)(id)(跟哪个表主键关联)
    -> );


删除外键 ALTER TABLE 表名 drop foreign key 外键名称
添加外键 ALTER TABLE 表名 ADD CONSTRAINT FK_ID foreign key(外键字段名) REFERENCES 外表表名(主键名)

相关文章

网友评论

    本文标题:范式、外键与auto_increment使用

    本文链接:https://www.haomeiwen.com/subject/lbyybftx.html