在表里面插入数据:默认情况下,一次插入操作只插入一行
语法
mysql> insert [into] 表名[(column1,column2......)] values
-> (value1,values2......),
-> (value1,values2......),
-> ......................
-> (value1,values2......);
mysql> create table class(
-> `班号` int primary key auto_increment
-> )engine=innodb auto_increment=1001 default charset=utf8mb4 row_format=dynamic;
Query OK, 0 rows affected (0.02 sec)
mysql> insert class(`班号`) values
-> (null),
-> (null),
-> (null);
Query OK, 3 rows affected (0.01 sec)
mysql> select * from class;
+------+
| 班号 |
+------+
| 1001 |
| 1002 |
| 1003 |
+------+
mysql> insert class(班号) values
-> (null);
Query OK, 1 row affected (0.01 sec)
mysql> select * from class;
+------+
| 班号 |
+------+
| 1001 |
| 1002 |
| 1003 |
| 1004 |
+------+
mysql> create table stu(
-> `学号` int primary key auto_increment,
-> `姓名` varchar(20) not null,
-> `性别` enum('男','女'),
-> `班级` int not null,
-> constraint stu_class_foreign foreign key(`班级`) references class(班号)
-> )engine=innodb auto_increment=1 default charset=utf8mb4 row_format=dynamic;
Query OK, 0 rows affected (0.03 sec)
mysql> desc stu;
+-------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------+------+-----+---------+----------------+
| 学号 | int | NO | PRI | NULL | auto_increment |
| 姓名 | varchar(20) | NO | | NULL | |
| 性别 | enum('男','女') | YES | | NULL | |
| 班级 | int | NO | MUL | NULL | |
+-------+-----------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> insert stu(学号,姓名,性别,班级) values
-> (1,小天,男,1001);
ERROR 1054 (42S22): Unknown column '小天' in 'field list' # 小天不是字符串类型
mysql> insert stu(学号,姓名,性别,班级) values
-> (1,'小天',男,1001);
ERROR 1054 (42S22): Unknown column '男' in 'field list' # 男不是字符串类型
mysql> insert stu(学号,姓名,性别,班级) values
-> (1,'小天','男',1001);
Query OK, 1 row affected (0.01 sec) # 单引号包裹,插入成功
mysql> insert stu(学号,姓名,性别,班级) values
-> (1,"小红","女",1002);
ERROR 1062 (23000): Duplicate entry '1' for key 'stu.PRIMARY' # 1必须是唯一值,否则插入失败
mysql> insert stu(学号,姓名,性别,班级) values
-> (null,"小红","女",1002);
Query OK, 1 row affected (0.00 sec) # auto_increment允许插入null
mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
| 1 | 小天 | 男 | 1001 |
| 2 | 小红 | 女 | 1002 |
+------+------+------+------+
2 rows in set (0.00 sec)
mysql> insert stu(学号,姓名,性别,班级) values
-> (null,"小红","女",1009); # 存在外键约束,1009不属于class表中的`班号`字段的范围
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`huazi`.`stu`, CONSTRAINT `stu_class_foreign` FOREIGN KEY (`班级`) REFERENCES `class` (`班号`))
mysql> insert stu(学号,姓名,性别,班级) values
-> (null,"小刚","男",1004);
Query OK, 1 row affected (0.01 sec) # 双引号包裹
mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
| 1 | 小天 | 男 | 1001 |
| 2 | 小红 | 女 | 1002 |
| 4 | 小刚 | 男 | 1004 |
+------+------+------+------+
# 为什么会是124,而不是123呢,因为当插入值为null时,auto_increment不管插入成功还是失败,都会自动加1
mysql> insert stu values
-> (3,'乐乐','男',1003),
-> (9,'天天','男',1002);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
| 1 | 小天 | 男 | 1001 |
| 2 | 小红 | 女 | 1002 |
| 3 | 乐乐 | 男 | 1003 |
| 4 | 小刚 | 男 | 1004 |
| 9 | 天天 | 男 | 1002 |
+------+------+------+------+
# 当插入3时,为什么3在4的前面?因为auto_increment有自动排序的功能
mysql> insert stu values
-> (11,'小明','nn',1003);
ERROR 1265 (01000): Data truncated for column '性别' at row 1
# 插入失败的原因:'nn'不在('男','女')中
mysql> insert stu values
-> (11,'小明',null,1003);
Query OK, 1 row affected (0.03 sec)
# 插入成功的原因:enum允许插入null值
语法
mysql> insert [into] 表名 set 字段1=值,字段2=值....;
mysql> insert stu set 学号=5,姓名='小花',性别='女',班级=1001;
Query OK, 1 row affected (0.01 sec)
mysql> insert stu set 学号=6,姓名='小哈',性别='未知',班级=1001;
ERROR 1265 (01000): Data truncated for column '性别' at row 1
# 插入失败的原因:'未知'不在('男','女')中
mysql> insert stu set 学号=6,姓名='小哈',性别=null,班级=1001;
Query OK, 1 row affected (0.00 sec)
# 插入成功的原因:enum允许插入null值
语法
mysql> replace [into] 表名[(字段1,字段2......)] values
-> (value1,values2......),
-> (value1,values2......),
-> .......................
-> (value1,values2......);
语法
mysql> replace [into] 表名 set 字段1=值1,字段2=值2........;
注:原有数据删除时也不能违背外键约束的条件
语法
mysql> update 表名 set 字段1=值,字段2=值...where 条件;
mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
| 1 | 小天 | 男 | 1001 |
| 2 | 小红 | 女 | 1002 |
| 3 | 乐乐 | 男 | 1003 |
| 4 | 小刚 | 男 | 1004 |
| 5 | 小花 | 女 | 1001 |
| 6 | 小哈 | NULL | 1001 |
| 9 | 天天 | 男 | 1002 |
| 10 | 小哈 | 男 | 1001 |
| 11 | 小明 | NULL | 1003 |
+------+------+------+------+
9 rows in set (0.00 sec)
#将学号为6的性别改为男
mysql> update stu set 性别='男' where 学号=6;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
| 1 | 小天 | 男 | 1001 |
| 2 | 小红 | 女 | 1002 |
| 3 | 乐乐 | 男 | 1003 |
| 4 | 小刚 | 男 | 1004 |
| 5 | 小花 | 女 | 1001 |
| 6 | 小哈 | 男 | 1001 |
| 9 | 天天 | 男 | 1002 |
| 10 | 小哈 | 男 | 1001 |
| 11 | 小明 | NULL | 1003 |
+------+------+------+------+
9 rows in set (0.00 sec)
#将姓名为小哈的数据的性别改为女
mysql> update stu set 性别='女' where 姓名='小哈';
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
| 1 | 小天 | 男 | 1001 |
| 2 | 小红 | 女 | 1002 |
| 3 | 乐乐 | 男 | 1003 |
| 4 | 小刚 | 男 | 1004 |
| 5 | 小花 | 女 | 1001 |
| 6 | 小哈 | 女 | 1001 |
| 9 | 天天 | 男 | 1002 |
| 10 | 小哈 | 女 | 1001 |
| 11 | 小明 | NULL | 1003 |
+------+------+------+------+
9 rows in set (0.00 sec)
mysql> update stu set 性名='原有' where 性名='小天';
ERROR 1054 (42S22): Unknown column '性名' in 'where clause'
#修改错误的原因:update不能修改自身
注:当修改单个数据时,where条件必须具有唯一性,否则将修改多个数据
语法
mysql> delete from 表名 where 条件;(清空条件中的某一行或几行数据)
mysql> delete from 表名; (清空全部数据)
mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
| 1 | 小天 | 男 | 1001 |
| 2 | 小红 | 女 | 1002 |
| 3 | 乐乐 | 男 | 1003 |
| 4 | 小刚 | 男 | 1004 |
| 5 | 小花 | 女 | 1001 |
| 6 | 小哈 | 女 | 1001 |
| 9 | 天天 | 男 | 1002 |
| 10 | 小哈 | 女 | 1001 |
| 11 | 小明 | 男 | 1003 |
+------+------+------+------+
mysql> delete from stu where 班级=1004;
Query OK, 1 row affected (0.01 sec)
mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
| 1 | 小天 | 男 | 1001 |
| 2 | 小红 | 女 | 1002 |
| 3 | 乐乐 | 男 | 1003 |
| 5 | 小花 | 女 | 1001 |
| 6 | 小哈 | 女 | 1001 |
| 9 | 天天 | 男 | 1002 |
| 10 | 小哈 | 女 | 1001 |
| 11 | 小明 | 男 | 1003 |
+------+------+------+------+
mysql> select * from class;
+------+
| 班号 |
+------+
| 1001 |
| 1002 |
| 1003 |
| 1004 |
+------+
mysql> delete from class where 班号=1004;
Query OK, 1 row affected (0.01 sec)
mysql> delete from class where 班号=1001;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`huazi`.`stu`, CONSTRAINT `stu_class_foreign` FOREIGN KEY (`班级`) REFERENCES `class` (`班号`))
# 不能删除的原因:存在外键约束
注:有外键约束时,当子表中存在主表的数据值,该主表中的数据值不能被删除;当主表中某数据值不在子表中时,主表中该数据值可以被删除
语法
mysql> truncate table 表名;(清空全部数据)