MySQL 超新手入门(6) CRUD 与资料维护

徐宁
• 阅读 3831

系列文章目录

1 取得表格资讯

1.1 DESCRIBE指令

「DESCRIBE」是MySQL资料库提供的指令,它只能在MySQL资料库中使用,这个指令可以取得某个表格的结构资讯,它的语法是这样的:

MySQL 超新手入门(6) CRUD 与资料维护

你在MySQL的工具中执行「DESC cmdev.dept」指令以后,MySQL会传回「cmdev.dept」表格的结构资讯:

MySQL 超新手入门(6) CRUD 与资料维护

1.2 栏位顺序

每一个表格在设计的时候,都会决定它有哪一些栏位,和所有栏位的详细设定。另外也会决定表格中的栏位顺序,知道表格栏位顺序在接下来的讨论中是很重要的:

MySQL 超新手入门(6) CRUD 与资料维护

注:如何建立一个新的表格会在「第八章、表格与索引」中讨论。

2 新增

2.1 基础新增叙述

新增资料到资料库的表格中使用「INSERT」叙述,下列是这个叙述的基本语法:

MySQL 超新手入门(6) CRUD 与资料维护

使用这个语法新增纪录的时候,要特别注意表格的栏位个数与顺序,下列的新增叙述会新增一笔部门的纪录到「cmdev.dept」表格中:

MySQL 超新手入门(6) CRUD 与资料维护

除了明确的指定新增纪录的每一个栏位资料外,你也可以使用「DEFAULT」关键字,让MySQL为你写入在设计表格的时候,为栏位指定的预设值。下列的新增叙述同样会新增一笔部门的纪录到「cmdev.dept」表格中,不过部门的所在位置(location)栏位值指定为使用预设值:

MySQL 超新手入门(6) CRUD 与资料维护

使用这种语法新增纪录的时候,如果资料个数与栏位个数不一样的话,就会发生错误:

MySQL 超新手入门(6) CRUD 与资料维护

资料个数虽然没有错,顺序却不对了,也有可能会造成错误:

MySQL 超新手入门(6) CRUD 与资料维护

新增叙述的另外一种语法,就提供比较灵活的新增纪录方式,你可以自己指定新增纪录的栏位个数和顺序:

MySQL 超新手入门(6) CRUD 与资料维护

在你额外为这个新增叙述指定栏位以后,指定储存资料的时候就要依照自己指定的栏位个数与顺序:

MySQL 超新手入门(6) CRUD 与资料维护

如果没有依照自己指定的栏位个数与顺序,就会发生错误:

MySQL 超新手入门(6) CRUD 与资料维护

因为这种新增叙述的语法可以自己指定栏位的个数与顺序,所以你只要指定写入栏位的资料就可以了。不过要特别注意下列两种语法的差异:

MySQL 超新手入门(6) CRUD 与资料维护

也因为这样的规定,所以下列这个新增叙述在语法上虽然没有错误,如果违反表格设计上的规定,同样会造成错误:

MySQL 超新手入门(6) CRUD 与资料维护

这种新增叙述的语法还有一个比较特别的用法,如果你要新增的纪录,所有栏位的值都要使用预设值,就可以使用下列的写法。不过要特别注意下列的新增叙述执行以后会造成错误,因为「deptno」与「dname」栏位的预设值是「NULL」,可是它们又不能储存「NULL」:

MySQL 超新手入门(6) CRUD 与资料维护

下列是新增叙述的第三种语法:

MySQL 超新手入门(6) CRUD 与资料维护

这种语法只是提供你另外一种新增纪录的写法,下列两个新增叙述的效果是一样的:

MySQL 超新手入门(6) CRUD 与资料维护

2.2 同时新增多笔纪录

上列讨论的新增叙述执行以后,都是一个叙述新增一笔纪录,如果需要的话,你也可以在一个新增叙述新增多笔纪录,差异只有在「VALUES」子句后面新增资料的指定:

MySQL 超新手入门(6) CRUD 与资料维护

如果你要新增下列三个员工资料到「cmdev.emp」表格中:

  ----------- ----------- ------------ ------------- -------------- ------------ ---------- ------------
  **empno**   **ename**   **job**      **manager**   **hiredate**   **salary**   **comm**   **deptno**
  8001        SIMON       MANAGER      7369          2001-02-03     3300         NULL       50
  8002        JOHN        PROGRAMMER   8001          2002-01-01     2300         NULL       50
  8003        GREEN       ENGINEER     8001          2003-05-01     2000         NULL       50
  ----------- ----------- ------------ ------------- -------------- ------------ ---------- ------------

你当然可以分别执行三个新增叙述将三个员工资料新增到「cmdev.emp」表格中;你也可以使用下列一个新增叙述,这个叙述执行以后,同样会新增三笔纪录:

MySQL 超新手入门(6) CRUD 与资料维护

2.3 索引值

在设计表格的时候,通常会视需要指定表格中的某一个栏位为「主索引」栏位:

MySQL 超新手入门(6) CRUD 与资料维护

注:一个表格除了可以设定「主索引」栏位外,资料库还提供其它几种不同的「索引」,索引的应用与设定会在后面「第八章、表格与索引」中详细讨论。

如果一个表格设定了某一个栏位为主索引以后,你在新增纪录时就不可以违反主索引的规定,否则会产生错误:

MySQL 超新手入门(6) CRUD 与资料维护

你可以在使用「INSERT」叙述的时候,加入「IGNORE」关键字,它可以在执行一个违反主索引规定的新增叙述时,自动忽略新增的动作,这样就不会产生错误讯息了:

MySQL 超新手入门(6) CRUD 与资料维护

2.4 索引值与ON DUPLICATE KEY UPDATE

使用「INSERT」叙述新增纪录的时候,还可以视需要在最后搭配一串关键字「ON DUPLICATE KEY UPDATE」,它可以用来指定在违反重复索引值的规定时要执行的修改:

MySQL 超新手入门(6) CRUD 与资料维护

需要为「INSERT」叙述搭配「ON DUPLICATE KEY UPDATE」的情况会比较特殊一些,所以接下来会使用「cmdev.travel」这个表格来讨论它的用法,「cmdev.travel」是员工资料库中用来储存出差资料的表格,每一个员工到某个地方出差的资料,都会储存在这个表格中:

MySQL 超新手入门(6) CRUD 与资料维护

因为这个表格的设计方式,所以如果要处理编号「7900」的员工到「BOSTON」出差资料的话,你就要执行下列的动作:

MySQL 超新手入门(6) CRUD 与资料维护

注:修改叙述「UPDATE」在下一节讨论。

你会发现要处理员工出差资料会是一件不算简单的工作,搭配「ON DUPLICATE KEY UPDATE」的「INSERT」叙述,可以让处理这类需求的叙述比较简单一些:

MySQL 超新手入门(6) CRUD 与资料维护

这个「INSERT」叙述执行以后,资料库会帮你执行需要的检查,根据检查的结果执行不同的动作:

MySQL 超新手入门(6) CRUD 与资料维护

2.5 「REPLACE」叙述

除了使用「INSERT」叙述新增纪录外,「REPLACE」叙述同样可以新增纪录,它们的语法几乎相同:

MySQL 超新手入门(6) CRUD 与资料维护

「INSERT」叙述的另一种写法也可以套用给「REPLACE」叙述:

MySQL 超新手入门(6) CRUD 与资料维护

会使用「REPLACE」叙述新增纪录的原因,主要还是考虑索引值的情况,「REPLACE」叙述在没有违反索引值的规定时,效果跟「INSERT」叙述一样,同样会新增纪录到表格中。

在发生重复索引值的时候,「INSERT」叙述会发生错误:

MySQL 超新手入门(6) CRUD 与资料维护

「INSERT」叙述搭配「IGNORE」关键字的时候:

MySQL 超新手入门(6) CRUD 与资料维护

同样的情况改用「REPLACE」叙述的话,它会执行修改纪录的动作:

MySQL 超新手入门(6) CRUD 与资料维护

3 修改

修改已经储存在表格中的纪录使用「UPDATE」叙述,下列是它的基本语法:

MySQL 超新手入门(6) CRUD 与资料维护

使用「UPDATE」叙述的时候,通常会搭配使用「WHERE」子句,用来指定要修改的纪录:

MySQL 超新手入门(6) CRUD 与资料维护

所以你在执行「UPDATE」叙述的时候,一定要依照实际的需求,正确的设定修改的条件。以下列两个修改叙述来说,它们执行后的差异是很大的:

MySQL 超新手入门(6) CRUD 与资料维护

3.1 搭配「IGNORE」

在使用「UPDATE」叙述的时候,也可以视需要加入「IGNORE」关键字,它可以防止错误的修改叙述出现错误讯息:

MySQL 超新手入门(6) CRUD 与资料维护

除了上列的情况外,你还必须特别注意修改多个栏位值的情况。首先是没有「IGNORE」关键字的时候,错误的资料会在执行修改叙述的时候产生错误讯息,当然也不会执行任何修改的动作:

MySQL 超新手入门(6) CRUD 与资料维护

同样的修改叙述加入「IGNORE」关键字后,执行后的结果可能会跟你想得不太一样了:

MySQL 超新手入门(6) CRUD 与资料维护

3.2 搭配「ORDER BY」与「LIMIT」

执行修改的时候使用「WHERE」子句是一般最常见的用法,在处理一些比较特殊的修改需求时,也会搭配「ORDER BY」与「LIMIT」子句:

MySQL 超新手入门(6) CRUD 与资料维护

「LIMIT」子句也可以在查询叙述中使用,不过在「UPDATE」叙述中使用「LIMIT」子句会有一个限制:

MySQL 超新手入门(6) CRUD 与资料维护

以同样为员工加薪一百的需求来说,搭配「ORDER BY」与「LIMIT」子句,可以完成许多不同的情况:

MySQL 超新手入门(6) CRUD 与资料维护

4 删除

4.1 「DELETE」叙述

删除表格中不再需要的纪录使用「DELETE」叙述,下列是它的语法:

MySQL 超新手入门(6) CRUD 与资料维护

使用「DELETE」叙述的时候,通常也会使用「WHERE」子句设定要删除哪些纪录:

MySQL 超新手入门(6) CRUD 与资料维护

执行删除的时候也可以搭配「ORDER BY」与「LIMIT」子句:

MySQL 超新手入门(6) CRUD 与资料维护

4.2 「TRUNCATE」叙述

如果要删除一个表格中所有的纪录,你可以选择使用「TRUNCATE」叙述,下列是它的语法:

MySQL 超新手入门(6) CRUD 与资料维护

要执行删除表格中所有的纪录,下列两个叙述的效果是一样的:

MySQL 超新手入门(6) CRUD 与资料维护

「TRUNCATE」叙述在执行删除纪录的时候,会比使用「DELETE」叙述的效率好一些,尤其是表格中的纪录非常多的时候会更明显。


via codedata

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
徐宁
徐宁
Lv1
孤舟蓑笠翁,独钓寒江雪。
文章
3
粉丝
0
获赞
0