MySQL:增、删、改
禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!
数据库的四个基本操作“增、删、查、改”,前面几篇我们着重谈了查,因为 SELECT 的使用比较有技巧性,接下来我们看看其他 3 个基操。
插入数据
INSERT
想要插入数据可以使用 INSERT 语句,这个语句可以插入行信息到数据库的表中,这个信息可以完整也可以是一部分。当我想要插入行时,就需要用 VALUES 子句罗列出要插入的信息,语法框架为:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
其中第一个括号内指的是表名,而 VALUES 所属的参数是与之对应的值,新的行将按照表名和值的对应关系生成并插入,插入的位置用 MySQL 自动增量实现。表名可以被省略,但是这种写法是“冒险的写法”,这是因为省略之后,你给出的值必须和列在数据表中出现的次序准确排列。这种写法很容易出错,因此推荐要把表名一起写上。
注意 VALUES 子句中的参数的数目必须正确,否则插入会不成功。对新的行来说可以不用把所有列都给出,就表示有的列不赋值,这个时候在 VALUES 同样也不需要给出对应的值。这个是有条件的,被省略的列必须可以被定义为 NULL 或带有默认值,否则省略列会报错。
从用户方面来说,我们有时候并不是很希望用户能修改数据库的数据,因此就需要对权限进行限制。同时在用户访问数据库时,查的操作可能开销会小于插入操作,当有多个操作需要被执行时,可以用以下代码限制优先级。
INSERT LOW_PRIORITY INTO
插入多个行
我们不需要每插入一个行就写一次 INSERT 语句,可以在 VALUES 后面用多个括号给出参数,表示不同行。
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN )
( value1, value2,...valueN )
……
( value1, value2,...valueN );
同时这样也能减少 INSERT 的开销,能够提高效率。
插入检索的数据
我们可以利用 SELECT 获取一部分数据,然后将其作为新的行插入表中,语法格式也很简单,就使用一个 SELECT 语句替换上面的 VALUES 子句即可。SELECT 中展示的列名不需要和插入的列名一致,只需要保证插入时不出错就行,将按照检索的顺序依次生成行插入到表中。这里的 SELECT 语句同样可以使用 WHERE 等语句进行过滤操作。
更新数据
UPDATE
当数据库的数据的现实意义发生变化时,就需要对现有的数据进行修改。修改数据可以使用 UPDATE 语句来实现,这个语句可以更新特定的行,也可以是所有的行全部更新。UPDATE 语句可以使用子查询检索出更多数据,实现更多的修改。语法框架如下:
UPDATE table_name
SET field1=new-value1, field2=new-value2
[WHERE Clause]
由此可见你需要提供 3 部分参数:要更新的表名、列名和修改的值、过滤条件。UPDATE 语句后跟着的是要更新的表名,列名和修改的值在 SET 子句后给出,不同的列用逗号隔开,过滤条件就使用熟悉的 WHERE 子句。在这里要强调下过滤条件,虽然这个参数是可选的,但是如果没有通过过滤条件加以限制,很容易就会对你不想修改数据的行操作,这是我们不希望看到的。
- 如果给出的值为 NULL,从作用上可以表示为删除一行中单个列的数据。
忽略错误
若 UPDATE 语句在更新数据时,可能会出现错误,这个时候操作会被中断,并且数据恢复原状。想要在错误发生时继续更新,并使得更新的数据不回复原状,可以添加 IGNORE 关键字。
UPDATE table_name
SET field1=new-value1, field2=new-value2
[WHERE Clause]
删除数据
DELETE
删除数据可以使用 DELETE 语句来实现,这个语句可以删除特定的行,也可以是删除所有的行(传说中的删库跑路)。如果删除了所有行的话,表依然存在,只是被清空了而已。语法框架如下:
DELETE FROM table_name
[WHERE Clause]
在这里要强调下过滤条件,虽然这个参数是可选的,但是如果没有通过过滤条件加以限制,很容易就会对你不想修改数据的行删除,这是我们不希望看到的。
这个操作更为简单,因为你不需要指定列名之类的参数,整个行将被直接删除掉。如果你只需要删除某个列的值,请使用 UPDATE 语句将值修改为 NULL。
注意事项
由于 UPDATE 和 DELETE 在操作不慎的情况下,都会对数据造成丢失(MySQL 没有撤销操作),这相当的危险,以下是一些注意事项:
- 如果不是为了修改或删除所有行,务必加上 WHERE 子句;
- 保证每个表都有主键;
- 使用这些语句之前先用 SELECT 对过滤条件进行测试;
- 使用强制实施引用的完整数据库;
- 对于用户,要限制其读写权限。
创建新表
CREATE TABLE
对于数据库中的表的创建、更新与删除,我们同样需要熟悉。创建表可以直接用交互式数据库软件,这么创建是比较省力的,也可以使用 CREATE TABLE 语句。该语句需要提供 2 个信息:新表的名字、表中列名及其定义。其中在创建新表时,表名不能是已经存在的,列名之后需要定义数据类型之间用逗号隔开。语法框架如下:
CREATE TABLE table_name
(column_name column_type);
对于一个列是否允许 NULL 需要在建表时指定,NULL 表示没有任何东西,当参数设置为 “NOT NULL” 时表示该列在插入或更新行时必须有值,不能为空。
主键
所谓主键,是值可以用于区分表中的每个行的列,可以是一个列也可以是多个列。我们可以想象没有主键,要定位我们要操作的行是多么的困难,因此为了便于操作,一般都要指定主键。主键需要满足以下 2 个条件,首先是不同的行的主键值不能相同,第二是每个行的主键不能为 NULL。注意如果是多个列为主键,这种组合关系也必须是唯一的。对于主键有一些比较好的使用手法:
- 不修改主键列的值;
- 不重用主键列的值;
- 不在主键列中使用可能会改变的值。
主键需要用 PRIMARY KEY 指定,如果要指定多个主键就用逗号隔开。
自动增量
对于某种数据,例如 id 号之类的值,如果手动写代码实现,无疑是很繁琐的。AUTO_INCREMENT 关键字可以添加自动增量功能,添加这个功能的列,当新的行被插入时就可以按照规律自动赋予合适的值,例如 id 号之类的。添加自动增量的列只能有一个,且必须被索引,因此这个列作为主键更为合适。这个你可以给某个行赋值一个值,这样后续的自动增量将以这个值为基准确定。
自动增量是 MySQL 自行生成的,我们不方便得知值。当我们启用了自动增量就可以使用 last_insert_id() 函数,可以获得最后一个自动增量的值:
select last_insert_id();
默认值
在创建新的表时,可以使用 DEFAULT 关键字为列指定默认值,当没有指定值是行将获得这个默认值。
一般使用默认值会比使用 NULL 有更好的效果,注意函数不能作为默认值。
选用引擎
不同的引擎具有不同的特点和优点,提供的服务也有所差异,可以使用 ENGINT =语句来指定,后面就写上使用的引擎。这个语句可以忽略,忽略将使用默认的引擎。常用以下引擎:
引擎 | 特点 |
---|---|
InnoDB | 事务处理引擎,不支持全文本搜索 |
MEMORY | 数据在内存操作,对于临时表等功能效率很高 |
MyISAM | 支持全文本搜索,不支持事务处理 |
引擎可以混用,但是外键不能跨引擎使用。我们也顺带提一下外键——包含另一个主键的某个表的一个列,可以描述两个表之间的关系。
表的删和改
更新操作
表存储数据之后,就尽量不要去更改了,如果需要更改就需要使用 ALTER TABLE 语句来修改表结构。使用时需要在语句后面给出要修改的表名,以及需要的操作。ALTER TABLE 语句可以定义外键,这里不对这个内容多谈。ALTER TABLE 语句的使用需要很小心,或者说只要是删除和更新操作的语句都要很小心,MySQL 没有撤销功能!
例如这个操作可以添加一个列:
这个操作可以删除一个列:
更改复杂的表
对于一个列贼多的表,直接更新容易出错,因此一般不会直接更新。比较安全的做法是创建一个新表,然后用 INSERT SELECT 语句将数据拷贝到新表中,然后将新表重命名,以此来替代旧表。
删除操作
使用 DROP TABLE 语句,后面跟上要删除的表名即可。
表的重命名
使用 **RENAME TABLE ** 语句,后面跟上要旧表名和新表名即可。
这个语句支持多个表的重命名。
参考资料
《MySQL Crash Course》[英] Ben Forta 著,刘晓霞 钟鸣 译,人民邮电出版社
菜鸟教程——MySQL 教程