关于我的数据库——MySQL——第二篇

(叠甲:如有侵权请联系,内容都是自己学习的总结,一定不全面,仅当互相交流(轻点骂)我也只是站在巨人肩膀上的一个小卡拉米,已老实,求放过)。

表的操作

创建表

语法:

create table table_name(field1 datatype,field2 datatype,field3 datatype
)character set 字符集 collate 校验规则 engin 存储引擎;

说:

1)field 表示列名;

2)datatype 表示列的类型;

3)character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准;

4)collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准;

例:

create table user(id int,name varchar(20) comment'用户名',password char(32) comment'密码',birthday date comment'生日'
)character set utf8 engine MyISAM;

注:不建议直接粘贴到自己的sql中,建议手敲。

说明:

        不同的存储引擎,创建表的文件不一样,MyISAM,在数据目中有三个不同的文件,分别是:

        1).frm:表结构

        2).MYD:表数据

        3).MYI:表索引

查看表结构
desc table_name;

示例:

修改表

在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的储存引擎等等,我们还有需求,添加字段,删除字段等等,这时候就需要修改表。

ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column
datatype]...);ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column
datatype]...);ALTER TABLE tablename DROP (column);

例:

在users表添加两条记录
insert into users values(1,'a','123','2024-10-23'),(2,'b','1234','2024-10-23');
在users表添加一个字段,用于保存图片路径 

alter table users add assets varchar(100)comment'图片路径'after birthday;

修改name ,将其长度改为60

alter table users modify name varchar(60);

删除password列

注:删除字段一定要小心,删除字段及其对应的列数据都没有。

alter table users drop password;

修改表名为employee
alter table users rename to employee;

注:to可以省略

将name字段改为xingming
alter table employee change name xingming varchar(60);--新字段需要完整定义

 

 删除表

语法格式:

DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...

示例:

drop table employee;

数据类型

数据类型的分类:数值类型、二进制,文本类型、时间日期、String类型;

数值类型
tinyint类型(带符号的范围-128~127,无符号范围0~255,默认有符号的)

数值越界测试:

mysql> create table tt1(num tinyint);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into tt1 values(1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt1 values(128); -- 越界插入,报错
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> select * from tt1;

说明:

1)在MySQL中,整数可以指定是有符号和无符号的,默认是有符号的;

2)可以通过unsigned来说明某个字段是无符号的;

无符号例子

mysql> create table tt2(num tinyint unsigned);
mysql> insert into tt2 values(-1); -- 无符号,范围是: 0 - 255
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into tt2 values(255);
Query OK, 1 row affected (0.02 sec)

注:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下。

bit类型

基本语法

bit[(M)]:位字段类型,M表示每个值的位数,范围从1~64,如果M被忽略,默认为1。
mysql> create table tt3 ( id int, a bit(8));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt3 values(10, 10);
Query OK, 1 row affected (0.01 sec)

为什么a的数据10没有出现?

bit字段在显示时,是按照ASSCII对应的值显示。

mysql> insert into tt4 values(65, 65);

当需要只存放0或1的值时,这样就可以定义bit(1),这样可以节省空间。

alter table tt3 add gender bit(1) after a;

当插入2时,已经越界了

小数类型
float

语法:

float[(m,d)][unsigned]:M指定显示长度,d指定小数位数,占用空间4个字节

例:float(4,2)表示的范围是-99.99~99.99,MySQL在保存值时会进行四舍五入。

mysql> create table tt4(id int, salary float(4,2));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt4 values(100, -99.99);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt4 values(101, -99.991); #多的这一点被拿掉了
Query OK, 1 row affected (0.00 sec)

例:如果定义的是float(4,2)unsigned这时,因为把它指定为无符号的数,范围是0~99.99

create table tt5(id int, salary float(4,2) unsigned);

decimal

语法:

decimal(m,d) [unsigned]:定点数m指定长度,d表示小数点的位数

1)decimal(5,2)表示范围是-999.99~999.99;

2)decimal(5,2)表示的范围是0~999.99;

3)decimal和float很相似,但是精度不一样;

create table tt6 ( id int, salary float(10,8), salary2
decimal(10,8));
insert into tt6 values(100,23.12345678, 23.12345678);

decimal的精度更准确,float表示的精度大约是7位,decimal整数最大位数m为65,支持小数最大位数d是30,如果d被省略,默认为0,如果m被省略,默认是10.如果希望小数的精度高,推荐使用decimal。

字符类型
char

语法:

char(L):固定长度字符串,L是可以储存的长度,单位为字符,最大长度可以为255

例:

create table tt7(-> id int,-> name char(2));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt7 values(100,'ab');
Query OK, 1 row affected (0.01 sec)mysql> insert into tt7 values(101,'四川');
Query OK, 1 row affected (0.01 sec)mysql> select *from tt7;
+------+--------+
| id   | name   |
+------+--------+
|  100 | ab     |
|  101 | 四川   |
+------+--------+
2 rows in set (0.00 sec)

char(2)表示可以存放两个字符,可以是字母或是汉字,但是不能超过2个,最多只能是255

mysql> create table tt8( id int, name char(256));
ERROR 1074 (42000): Column length too big for column 'name' (max = 255); use BLOB or TEXT instead
varvhar

语法:

varchar(L):可变长度字符串,L表示字符长度,最大长度是65535个字节

例:

mysql> create table tt8(-> id int,-> name varchar(6));
Query OK, 0 rows affected (0.04 sec)mysql> insert into tt8 values(100,'hello');
Query OK, 1 row affected (0.01 sec)mysql> insert into tt8 values(101,'我爱你,中国');
Query OK, 1 row affected (0.00 sec)

关于carchar(len),len到底多大,这个len值,和表的编码密切相关:

1)varchar长度可以指定0~65535之间的值,但是有1~3个字节用于记录数据大小,所以说有效字节是65532.

2)当我们的编码是utf8是,carchar(n)的参数n最大值是65532/3=21844(因此在utf8中,一个字符占用了3个字节),如果是编码gbk,varchar(n)的参数n最大是65532/2 = 32766(因为gbk中,一个字符占用2字节)。

mysql> create table tt9(name varchar(21845))charset==utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> create table tt9(name varchar(21844))charset==utf8;
Query OK, 0 rows affected (0.02 sec)

验证了utf8确实是不能超过21844的;

char和varchar比较(utf8)
实际存储char(4)varchar(4)char占用字节varchar占用字节
abcdabcdabcd4*3 = 124*3+1 = 13
aaa4*3 = 121*3+1 = 4
abcdeXX数据超过长度数据超过长度

 如何选择定长或者变长字符串?

1)如果数据确认长度都一样,就使用定长(char),比如身份证、手机号;

2)如果数据长度有变化就使用变成(varchar)比如,名字,地址,但要保证最长的数据可以存进去;

3)定长的磁盘空间比较浪费,但效率高;变长的磁盘空间比较节省,但效率低;

4)定长的意义是,直接开辟好对应的空间;变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少;

日期和时间类型

常用的日期有如下三个

1)date:日期'yyyy-mm-dd',占用三字节;

2)datetime:时间日期格式'yyyy-mm-dd hh:ii:ss'表示范围从1000~9999,占用八字节;

3)timestamp:时间戳,从1970年开始的'yyyy-mm-dd hh:ii:ss'格式和datetime完全一致,占用四字节;

例子

mysql> create table birthday(-> t1 date,-> t2 datetime,-> t3 timestamp);
Query OK, 0 rows affected (0.01 sec)mysql> insert into birthday(t1,t2)values('2018-8-8','2018-9-9 8:8:8');
Query OK, 1 row affected (0.00 sec)mysql> select *from birthday;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 2018-08-08 | 2018-09-09 08:08:08 | 2024-10-24 11:37:03 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

添加数据时,时间戳会自动添加

更新数据

mysql> update birthday set t1 = '2022-2-22';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select *from birthday;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 2022-02-22 | 2018-09-09 08:08:08 | 2024-10-24 11:39:51 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)
enum 和set

语法

enum:枚举,"单选"类型;
enum{'选择1','选择2','选择3',……};

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是‘数字’,因为这些选项的每一个选项值依次对应如下数字:1,2,3……65535;当我们添加枚举值时,也可以添加对应的数字编号。

set:集合,“多选”类型;
set('选项值1','选项值2','选项值3',……);

该设定只是提供了若干个选项的值,最终一个单元格中设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应以下数字,1,2,4,8……,最多64个。

例:有一个调查表votes,需要调查人的喜好,比如(登山、游泳、篮球、武术)中去选择(可以多选)(男,女)(单选)

创建表

mysql> create table votes(-> username varchar(30),-> hobby set('登山','游泳','篮球','武术'),-> gender enum('男','女'));
Query OK, 0 rows affected (0.02 sec)

插入数据

mysql> insert into votes values('lisi','登山,武术',''男');
Query OK, 1 row affected (0.01 sec)mysql> insert into votes values('juse','登山,武术',''2');
Query OK, 1 row affected (0.01 sec)mysql> insert into votes values('lilei','登山','1');
;
Query OK, 1 row affected (0.00 sec)mysql> insert into votes values('王五','篮球','1');Query OK, 1 row affected (0.00 sec)mysql> insert into votes values('翠花','游泳','2'); 
Query OK, 1 row affected (0.01 sec)

查询想要登山的人

mysql> select *from votes where hobby = '登山';
+----------+--------+--------+
| username | hobby  | gender |
+----------+--------+--------+
| lilei    | 登山   | 男     |
+----------+--------+--------+
1 row in set (0.00 sec)

不能查询出所有,爱好为登山的人。

集合查询使用find_in_set函数,find_in_set(sub,str_list),如果sub在str_list,则返回下标,如果不在,返回0,str_list用逗号分隔的字符串。

mysql> select find_in_set('a','a,b,c');
+--------------------------+
| find_in_set('a','a,b,c') |
+--------------------------+
|                        1 |
+--------------------------+
1 row in set (0.00 sec)mysql> select find_in_set('d','a,b,c');
+--------------------------+
| find_in_set('d','a,b,c') |
+--------------------------+
|                        0 |
+--------------------------+
1 row in set (0.00 sec)

所有,查询爱好登山的人

mysql> select *from votes where find_in_set('登山',hobby);
+----------+---------------+--------+
| username | hobby         | gender |
+----------+---------------+--------+
| lisi     | 登山,武术     | 男     |
| juse     | 登山,武术     | 女     |
| lilei    | 登山          | 男     |
+----------+---------------+--------+
3 rows in set (0.00 sec)

表的约束

真正约束字段的是数类型,但是数据类型约束很单一,需要一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,比如有一个字段email,要求是唯一的。

表的约束很多,这里主要介绍如下几个:null/not null,default,comment,zerofill,primary key,auto_increment,unique key。

空属性

两个值:null(默认的)和not null(不为空)

数据库默认字段都是字段为空,但实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。

mysql> select null+1;
+--------+
| null+1 |
+--------+
|   NULL |
+--------+
1 row in set (0.00 sec)mysql> select null;
+------+
| NULL |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

例:创建一个班级表,包含班级名和班级所在教室,站在正常角度来说,如果班级没有名字,你不知道你在哪个班级,如果教师名字可以为空,就不知道在哪里上课。所以在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。

mysql> create table myclass( class_name varchar(20) not null, class_room varchar(10) not null);
Query OK, 0 rows affected (0.02 sec)mysql> desc myclass;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_name | varchar(20) | NO   |     | NULL    |       |
| class_room | varchar(10) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

插入数据时,没有给教室数据就会插入失败

mysql> insert into myclass(class_name)values('class1');
ERROR 1364 (HY000): Field 'class_room' doesn't have a default value
默认值(缺省值)

某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

mysql> create table tt10( name varchar(20) not null, age tinyint unsigned default 0, sex char(2) default '男');
Query OK, 0 rows affected (0.03 sec)mysql> desc tt10;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| name  | varchar(20)         | NO   |     | NULL    |       |
| age   | tinyint(3) unsigned | YES  |     | 0       |       |
| sex   | char(2)             | YES  |     | 男      |       |
+-------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值

mysql> insert into tt10(name)values('zhangsan');
Query OK, 1 row affected (0.00 sec)mysql> select *from tt10;
+----------+------+------+
| name     | age  | sex  |
+----------+------+------+
| zhangsan |    0 | 男   |
+----------+------+------+
1 row in set (0.00 sec)
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或者DBA来进行了解。
mysql> create table tt11(-> name varchar(20) not null comment '姓名',-> age tinyint unsigned default 0 comment '年龄',-> sex char(2) default '男' comment '性别');
Query OK, 0 rows affected (0.02 sec)

注:not null和default一般不需要同时出现,因为default本身有默认值,不会为空。

mysql> desc tt11;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| name  | varchar(20)         | NO   |     | NULL    |       |
| age   | tinyint(3) unsigned | YES  |     | 0       |       |
| sex   | char(2)             | YES  |     | 男      |       |
+-------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

通过show可以看到

mysql> show create table tt11\G;
*************************** 1. row ***************************Table: tt11
Create Table: CREATE TABLE `tt11` (`name` varchar(20) NOT NULL COMMENT '姓名',`age` tinyint(3) unsigned DEFAULT '0' COMMENT '年龄',`sex` char(2) DEFAULT '男' COMMENT '性别'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
zerofill

在学习 数据库时,很多人对数字类型后面的长度有疑问,通过show查看以下表的建表语句:

mysql> show create table tt12\G
*************************** 1. row ***************************Table: tt12
Create Table: CREATE TABLE `tt12` (`a` int(10) unsigned DEFAULT NULL,`b` int(10) unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

可以看到int(10),这个代表什么意思呢?整形不是4个字节吗?这个10又代表什么呢?其实没有zerofill这个属性,括号内的数据是没有意义的。

没有zerofill属性

mysql> insert into tt12 values(1,2);
Query OK, 1 row affected (0.00 sec)mysql> select *from tt12;
+------+------+
| a    | b    |
+------+------+
|    1 |    2 |
+------+------+
1 row in set (0.00 sec)

添加了zerofill属性

mysql> alter table tt12 modify a int(5) unsigned zerofill;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> select *from tt12;
+-------+------+
| a     | b    |
+-------+------+
| 00001 |    2 |
+-------+------+
1 row in set (0.00 sec)

可以看到原来的a的值由原来的1变成了00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的5),自动填充0.要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1,为什么会是这样呢?我们可以hex函数来证明。

mysql> select a,hex(a) from tt12;
+-------+--------+
| a     | hex(a) |
+-------+--------+
| 00001 | 1      |
+-------+--------+
1 row in set (0.00 sec)

可以看出数据库内部还是存储的1,00001只是设置了zerofill属性后的一种格式化输出而已。

主键

主键:primary key用来唯一的约束字段里面的数据,不能重复,不能为空,一张表最多只能有一个主键;主键所在的列表通常是整数类型。

例子:在创建表的时候直接在字段上指定主键

mysql> create table tt13( id int unsigned primary key comment '学号不能为空', name varchar(20) not nulll);
Query OK, 0 rows affected (0.02 sec)mysql> desc tt13;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(10) unsigned | NO   | PRI | NULL    |       |
| name  | varchar(20)      | NO   |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

主键约束:主键对应中的字段不能重复,一旦重复,操作失败。

mysql> insert into tt13 values(1,'aaa');
Query OK, 1 row affected (0.00 sec)mysql> insert into tt13 values(1,'bbb');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

当表创建以后但是没有主键的时候,可以再次追加主键;

alter table table_name add primary key(字段列表)

删除主键

alter table table_name drop primary key;
mysql> alter table tt13 drop primary key;
Query OK, 1 row affected (0.05 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> desc tt13;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(10) unsigned | NO   |     | NULL    |       |
| name  | varchar(20)      | NO   |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
复合主键

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段,作为主键,可以使用复合主键。

mysql> create table tt14(-> id int unsigned,-> course char(10) comment '课程代码',-> socre tinyint unsigned default 60 comment '成绩',-> primary key(id,course));
Query OK, 0 rows affected (0.03 sec)mysql> desc tt14;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| id     | int(10) unsigned    | NO   | PRI | NULL    |       |
| course | char(10)            | NO   | PRI | NULL    |       |
| socre  | tinyint(3) unsigned | YES  |     | 60      |       |
+--------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)mysql> insert into tt14(id,course)values(1,'123');
Query OK, 1 row affected (0.00 sec)mysql> insert into tt14(id,course)values(1,'123');
ERROR 1062 (23000): Duplicate entry '1-123' for key 'PRIMARY'
自增长

auto_increment:当前对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同值,通常搭配主键使用,作为逻辑主键。

自增长的特点:

1)任何一个字段要做自增长,前提是本身是一个索引(key一栏有值);

2)自增长字段必须是整数;

3)一张表最多只能有一个自增长;

例子:

mysql> create table tt15(-> id int unsigned primary key auto_increment,-> name varchar(10) not null default '');
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt15(name) values('a');
Query OK, 1 row affected (0.00 sec)mysql> insert into tt15(name) values('b');
Query OK, 1 row affected (0.01 sec)mysql> select *from tt15;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
+----+------+
2 rows in set (0.00 sec)

在插入后获取上次插入的auto_increment的值(批量插入获取的第一个值)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                2 |
+------------------+
1 row in set (0.00 sec)
索引(以后细讲):

在关系数据库中,索引是一种单独的、物理的对数据库表中对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序,数据库使用索引可以找到特定值,然后顺指针找到包含该值的行,这样可以使对应于表的SQL语句执行的更快,可快速访问数据库表中的特定信息。

唯一键

一张表中有往往很多字段需要唯一性,数据不能重复,但是一张表中中只能有一个主键;唯一键就可以解决表中有多个字段需要唯一性约束的问题。唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

唯一键和主键的区别:

我们可以简单理解成,主键更多是表示唯一性的,而唯一键更多的是保证在业务上,不要和别的信息重复。

例子:

mysql> create table student(-> id char(10)unique comment '学号,不能重复,但可以为空',-> name varchar(10)-> );
Query OK, 0 rows affected (0.02 sec)mysql> insert into student values('01','aaa');
Query OK, 1 row affected (0.00 sec)mysql> insert into student values('01','bbb');
ERROR 1062 (23000): Duplicate entry '01' for key 'id'
mysql> insert into student values(null,'bbb');
Query OK, 1 row affected (0.00 sec)mysql> select *from student;
+------+------+
| id   | name |
+------+------+
| 01   | aaa  |
| NULL | bbb  |
+------+------+
2 rows in set (0.00 sec)
外键

外键用于定义主表和从表之间的关系,外键约束主要定义在从表上,主表必须要有主键约束或unique约束,当定义外键后,要求外键列数据必须在主表的主键列存在或者为null.

语法

foreign key (字段名) reference 主表(列)

例:

先创建主键表

mysql> create table myclass(-> id int primary key,-> name varchar(30) not null comment '班级名'); 
Query OK, 0 rows affected (0.02 sec)

再创建从表

mysql> create table stu(-> id int primary key,-> name varchar(30) not null comment '学生名',-> class_id int,-> foreign key (class_id) references myclass(id));
Query OK, 0 rows affected (0.02 sec)

插入数据

mysql> insert into myclass values(10,'实验班'),(20,'小尖班');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> insert into stu values(100,'张三',10),(101,'李四',20);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

插入一个班级号为30的学生,因为没有这个班级,所以不能插入成功

mysql> insert into stu values(102,'王五',30);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test_4`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `myclass` (`id`))

 插入班级id为null,比如来了一个学生,目前还没有分配班级

mysql> insert into stu values(103,'二麻子',null);
Query OK, 1 row affected (0.01 sec)mysql> select *from stu;
+-----+-----------+----------+
| id  | name      | class_id |
+-----+-----------+----------+
| 100 | 张三      |       10 |
| 101 | 李四      |       20 |
| 103 | 二麻子    |     NULL |
+-----+-----------+----------+
3 rows in set (0.00 sec)

ok,本章结束,谢谢学习(撒花撒花)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460972.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python飞舞蝙蝠

目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码…

Canvas简历编辑器-选中绘制与拖拽多选交互设计

Canvas简历编辑器-选中绘制与拖拽多选交互设计 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM,并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上,关注于实现选中绘制与拖拽多选交…

基于Multisim的四位抢答器设计与仿真

四位选手进行抢答比赛,用基本门电路及集成逻辑器件构成四人抢答器。选手编号分别为1,2,3,4号,用S1,S2,S3,S4四个按钮作为抢答按钮,S0按钮为总清零按钮。当四人中任何一个…

20241031使用Rockchip原厂RK3566的Buildroot编译RK3399方案

20241031使用Rockchip原厂RK3566的Buildroot编译RK3399方案 2024/10/31 18:06 RK3566_Linux5.10_V1.2.0_20241022.tar.gz rk356x_linux5p10_v120_20241025_1020.tgz 由于Rockchip可能像全志一样,为了简单,直接所有的SDK都打包/放置在一个git仓库里了&…

算法定制LiteAIServer视频智能分析软件的过亮、过暗及抖动检测应用场景

在现代社会中,视频监控系统扮演着举足轻重的角色,其视频质量直接关乎监控系统的可靠性与有效性。算法定制LiteAIServer通过引入抖动检测和过亮过暗检测功能,为视频监控系统的稳定性和用户体验带来了显著提升。 以下是对这两种功能的技术实现、…

OpenCV 学习笔记

OpenCV 环境安装 pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 显示窗口 cv2.namedWindow 是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常…

超越 YOLOv8,MAF-YOLO利用重参化异构卷积大幅度提升多尺度信息融合能力!

由于多尺度特征融合的有效性能,路径聚合FPN(PAFPN)被广泛应用于YOLO检测器中。 然而,它不能同时高效且自适应地融合高级语义信息与低级空间信息。本文提出了一种名为MAF-YOLO的新模型,这是一个具有多功能 Neck 网络的新…

堆(堆排序,TOP K, 优先级队列)

1 概念解释 堆的定义:堆是一颗完全二叉树,分为大堆和小堆 大堆:一棵树中,任何父亲节点都大于等于孩子的节点,大堆的根结点最大 小堆:一棵树中,任何父亲节点都小于等于孩子节点,小堆…

练习LabVIEW第二十八题

学习目标: 刚学了LabVIEW,在网上找了些题,练习一下LabVIEW,有不对不好不足的地方欢迎指正! 第二十八题: 建立一个VI,模拟滚动—个骰子(骰子取值1~6),跟踪骰子滚动后的取值出现次数…

延迟队列的安装步骤

RabbitMQ 中的延迟队列(Delayed Queue)是一种特殊的队列,用于在消息被发送后延迟一段时间再投递给消费者。它在许多场景中非常有用,例如需要定时执行的任务、限流、重试机制等。 使用场景 定时任务: 例如发送提醒邮件或通知&…

六,Linux基础环境搭建(CentOS7)- 安装HBase

Linux基础环境搭建(CentOS7)- 安装HBase 大家注意以下的环境搭建版本号,如果版本不匹配有可能出现问题! 一、HBase下载及安装 HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“…

在 .NET 8 Web API 中实现 Entity Framework 的 Code First 方法

本次介绍分为3篇文章: 1:.Net 8 Web API CRUD 操作.Net 8 Web API CRUD 操作-CSDN博客 2:在 .Net 8 API 中实现 Entity Framework 的 Code First 方法https://blog.csdn.net/hefeng_aspnet/article/details/143229912 3:.NET …

斐波那契时间序列,精准捕捉市场拐点 MT4免费公式源码!

指标名称:斐波那契时间序列 版本:MT4 ver. 2.01 斐波那契时间序列是一种技术分析工具,通过将斐波那契数列(如1, 2, 3, 5, 8, 13等)应用于时间轴上,用于预测市场价格的时间周期拐点。斐波那契时间序列在股…

Unsafe Fileupload-pikachu

系列目录 第一章 暴力破解 第二章 Cross-Site Scripting-pikachu 第三章 CSRF 第四章 sql-injection 第五章 RCE 第六章 File inclusion 第七章 Unsafe filedownload 第八章 Unsafe fileupload 概述 不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见&#x…

嵌入式学习-网络-Day05

嵌入式学习-网络-Day05 1.网络超时检测 1.1应用场景 1.2设置超时检测 1)通过参数设置 2)setsockopt属性设置 3)定时器alarm设置 2.广播 2.1广播发送流程: 2.2广播接收流程: 3.组播 3.1组播发送流程 3.2组播接收流程 4.…

Android启动流程_SystemServer阶段

前言 上一篇文档我们描述了在 Android 启动流程中 Zygote 部分的内容,从 Zygote 的配置、启动、初始化等内容展开,描述了 Zygote 在 Android 启动中的功能逻辑。本篇文档将会继续 Android 启动流程的描述,从 SystemServer 进程的内容展开&am…

一年期免费HTTPS证书:网络安全新选择

HTTPS证书的重要性 HTTPS证书,全称为安全套接字层/传输层安全协议证书,是一种在互联网上建立安全连接的数字证书。它通过公钥加密技术,对网站和用户之间的数据传输进行加密,有效防止数据被窃取或篡改,保障用户信息的安…

(实战)WebApi第10讲:Swagger配置、RESTful与路由重载

一、Swagger配置 1、导入SwashBuckle.AspNetCore包 2、在.NET Core 5框架里的startup.cs文件里配置swagger 3、在.NET Core 6框架里的Program.cs文件里配置swagger 二、RESTful风格:路由重载,HttpGet()括号中加参数 (1)原则&…

Pr 视频效果:闪光灯

视频效果/风格化/闪光灯 Stylize/Strobe Light 闪光灯 Strobe Light效果可用于在视频中创建闪烁或频闪的效果,类似于舞台上的频闪灯或摄影中的闪光灯。 ◆ ◆ ◆ 效果选项说明 通过调整各种参数,可以自定义闪光的颜色、频率、持续时间和混合模式&#…

Spring自动装配(特别版)

今天整理了一下Spring自动装配的过程,也突出了几个比较难以解答的问题.实践来求真知. 一. 自动装配过程 先按类型查找,若只有一个则直接返回如果找到多个,则匹配名字如果名字不一致,则报错. 二. 自动装配方式 构造器注入(推荐): 因为如果有一天脱离了Spring的环境,我们去使用…