从头开始学MySQL--------增删改
8.1.1 为表的所有字段插入数据
标准的插入语法为:为表中的所有的列插入数据,一 一对应。
使用该语句的时候,字段列和数据值的数量必须相同。
INSERT INTO table_name(COLUMN_LIST) VALUES( VALUE_LIST );
DROP TABLE IF EXISTS t_person;
CREATE TABLE t_person
(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT(11),
sex CHAR(1), -- 1为男,2为女
address VARCHAR(255),
remark VARCHAR(11)
);
INSERT INTO t_person (id,name,age,sex,address,remark)
VALUES (1,'大宇',23,'1','苏州','穷小子')
在插入语句中,其实可以不要按照定义表的时候定义COLUMN_LIST的属性,可以适当的调整,比如把age放到name之前。
若COLUMN_LIST 为 空,此时值列表VALUE_LIST中需要为表的每一个字段指定值,并且指定的顺序要与数据表中字段定义时的顺序相同。
若主键是可以自增的,那么插入的数据主键即使为NULL,MySQL也会自动为其分配一个主键。
INSERT INTO t_person VALUES(NULL,'小大宇',22,'1','suZhou','MySQL Lover');
忽略插入的列名称的优劣
好处:可以简化我们的SQL
坏处:一旦表的结构发生变化,那么这个SQL语句就会报错。比如表的列出现增加,删除或者列位置改变。
8.1.2 为表的指定字段插入数据
不一定要为所有的字段插入数据,只向部分字段中插入值,其它没有指明插入的字段值将会被插入默认值。没有指明默认值的字段,将插入NULL。
先将性别默认设计为男,即字符串'1'。
ALTER TABLE t_person modify sex CHAR(1) DEFAULT '1';
DESC t_person;
INSERT INTO t_person(name,age) VALUES('宇师傅',32);
拨云见日
如上插入结果所示,因为sex的默认值是'1',所以插入的数据默认为'1'。主键由MySQL自动生成。而address与remark属性没有默认值,所以用NULL来补充。name 与 age 属性由用户指明。所以,插入语句可以不用提供所有的字段值,只为需要插入的列提供数据,其它列用其默认值填充,没有默认值的用NULL填充。
8.1.3 同时插入多条数据
插入时指定多个值列表VALUES_LIST,每个值列表用逗号分开。
INSERT INTO t_person(name,age) VALUES('小雨',22),('大雨',22),('暴雨',22);
一条插入多条记录的INSERT语句等同于多个单行插入的INSERT语句。
对于性能而言,一条插入多条记录的INSERT语句,效率高于多个单行插入的INSERT语句。
8.1.4 将查询结果插入到表中
语法规范:
INSERT INTO table_name(COLUMN_LIST)
SELECT(COLUMN_LIST2) FROM table_name2 [ WHERE condition ]
DROP TABLE IF EXISTS t_info;
CREATE TABLE t_info
(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
accountName VARCHAR(255) NOT NULL,
accountAddress VARCHAR(255) NOT NULL
);
-- 如果忽略主键,那么会报错,所以要一一对应,及时用NULL,也要填上
-- 已经错了一次了!
INSERT INTO t_info VALUES(NULL,'刀锋之影','诺克萨斯');
为了把其它表中的数据迁移到t_person 表中,可以执行如下SQL。
INSERT INTO t_person(name,address)
SELECT accountName , accountAddress FROM t_info;
COLUMN_LIST 与 COLUMN_LIST2必须字段个数相同,数据类型相同(?,好像不一定要完全相同),但是不需要名称完全相同,就像上面的例子那样。
查询出来的值如果能够顺利转型成INSERT 语句需要的值,就能插入到数据库中。
2018年12月06日在项目中遇到的实际插入问题
如果一个字段拥有了默认值,但是又显示的给其赋值为 null,那么会插入null。
t_tag表中,articleId列已经设计为默认值为5。执行下面的SQL后
-- articleId 默认值为 5
INSERT INTO t_tag(name,articleId) values ("a",null);
INSERT INTO t_tag(name) values ("a");
从实际结果来看,即使我们为articleId设计了默认值,但是在第一条SQL中显示的指明了它为null,所以在数据库中实际将会插入NULL。若像第二条SQL语句一样,没有指明此列,更没有此列的值,那么就用默认值实际插入某条记录。
我现在遇到的问题是,用户传递的articleId列数据确实是null,但是SQL语句又要像第一条SQL那样的写法,即在插入的参数列表中,有articleId这样的列。为了防止插入是空,只能用硬编码。
INSERT INTO t_tag(name,articleId) values ("a",IFNULL(#{ item.articleId } , 5)); 这里的5是articleId的默认值。
Mybatis还有一种办法就是,使用IF TEST 语句来控制列的存在。 在 articleId 这一列上,加上 IF TEST 控制。
<if test="organoizationProportion!=null and organoizationProportion !=''">
,COST_ORGANIZATION_PROPORTION
</if>
8.2.1 更新
语法: UPDATE table_name SET column1 = A , column2 = B [ WHERE conditon ]
同样,不增加条件,也是全表更新,一定要加条件。(偷偷的告诉你,我坑了一次公司的数据库)
UPDATE t_person SET sex = '0' WHERE id BETWEEN 2 AND 6;
8.2.2 删除
删除记录将会删除一整条记录,也可以通过范围删除,比如添加条件 WHERE id BETWEEN 3 AND 5;
若不加条件,则删除整张表的数据,慎用!
语法:DELETE FROM table_name [WHERE condition]