从头开始学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]

阅读更多

         目录贴:从头开始学MySQL-------目录帖

posted @ 2022-07-17 12:15  小大宇  阅读(24)  评论(0编辑  收藏  举报