插入、更新与删除数据

插入数据

为表的所有字段插入数据
语法格式:INSERT INTO table_name (column_list) VALUES (lavues_list);
mysql> CREATE TABLE person
    -> (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> name CHAR(40) NOT NULL DEFAULT '',
    -> age INT NOT NULL DEFAULT 0,
    -> info CHAR(50) NULL,
    -> PRIMARY KEY (id)
    -> );
Query OK, 0 rows affected (0.19 sec)

mysql> SELECT * FROM person;
Empty set (0.00 sec)

mysql> INSERT INTO person (id ,name, age, info)
    -> VALUES (1, 'Green', 21, 'Lawyer');
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO person
    -> VALUES (2, 'Willam', 20, 'sports man');
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM person;
+----+--------+-----+------------+
| id | name   | age | info       |
+----+--------+-----+------------+
|  1 | Green  |  21 | Lawyer     |
|  2 | Willam |  20 | sports man |
|  3 | Mary   |  24 | Musician   |
| 22 | Suse   |   2 | dancer     |
+----+--------+-----+------------+
4 rows in set (0.00 sec)
为表的指定字段插入数据
语法格式:INSERT INTO table_name (col_name_1,col_name_2,col_name_3,..,col_name_n)
		  VALUES (value_col_1,value_col_2,value_col_3,..,value_col_n);

mysql> INSERT INTO person
    -> VALUES (2, 'Willam', 20, 'sports man');
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM person;
+----+--------+-----+------------+
| id | name   | age | info       |
+----+--------+-----+------------+
|  1 | Green  |  21 | Lawyer     |
|  2 | Willam |  20 | sports man |
|  3 | Mary   |  24 | Musician   |
| 22 | Suse   |   2 | dancer     |
+----+--------+-----+------------+
4 rows in set (0.00 sec)
同时插入多条记录

插入多条记录时,MySQL会返回一些在执行单行插入是没有的额外信息,这些信息的含义如下:
Records: 2 Duplicates: 0 Warnings: 0

  1. Records:表名插入的记录条数。
  2. Duplicates:表名插入时被忽略的记录,原因可能是这些记录包含了重复的主键值。
  3. Warnings:表明有问题的数据值,例如发生数据类型转换等等。
语法格式:INSERT INTO table_name (column_list) VALUES (value_list1), (value_list2),..,(value_listn);

mysql> INSERT INTO person (id, name, age, info)
    -> VALUES (22, 'Suse', 2, 'dancer'),
    -> (3, 'Mary', 24, 'Musician');
Query OK, 2 rows affected (0.10 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM person;
+----+-------+-----+----------+
| id | name  | age | info     |
+----+-------+-----+----------+
|  1 | Green |  21 | Lawyer   |
|  3 | Mary  |  24 | Musician |
| 22 | Suse  |   2 | dancer   |
+----+-------+-----+----------+
3 rows in set (0.00 sec)

mysql> INSERT INTO person (name, age, info)
    -> VALUES ('Dale', 22, 'cook'),
    -> ('Edision', 28, 'singer');
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM person;
+----+---------+-----+------------+
| id | name    | age | info       |
+----+---------+-----+------------+
|  1 | Green   |  21 | Lawyer     |
|  2 | Willam  |  20 | sports man |
|  3 | Mary    |  24 | Musician   |
| 22 | Suse    |   2 | dancer     |
| 23 | Dale    |  22 | cook       |
| 24 | Edision |  28 | singer     |
+----+---------+-----+------------+
6 rows in set (0.00 sec)
将查询结果插入到表中
语法格式:INSERT INTO table_name1 (column_list1) SELECT (column_list2) FROM table_name2 WHERE (condition);

mysql> CREATE TABLE person_old
    -> (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> name CHAR(40) NOT NULL DEFAULT '',
    -> age INT NOT NULL DEFAULT 0,
    -> info CHAR(50) NULL,
    -> PRIMARY KEY (id)
    -> );
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO person_old
    -> VALUES (11,'Harry',20,'student'),
    -> (12,'Beckham',31,'police');
Query OK, 2 rows affected (0.12 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM person_old;
+----+---------+-----+---------+
| id | name    | age | info    |
+----+---------+-----+---------+
| 11 | Harry   |  20 | student |
| 12 | Beckham |  31 | police  |
+----+---------+-----+---------+
2 rows in set (0.00 sec)

mysql> INSERT INTO person (id,name,age,info)
    -> SELECT id,name,age,info FROM person_old;
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM person;
+----+---------+-----+------------+
| id | name    | age | info       |
+----+---------+-----+------------+
|  1 | Green   |  21 | Lawyer     |
|  2 | Willam  |  20 | sports man |
|  3 | Mary    |  24 | Musician   |
| 11 | Harry   |  20 | student    |
| 12 | Beckham |  31 | police     |
| 22 | Suse    |   2 | dancer     |
| 23 | Dale    |  22 | cook       |
| 24 | Edision |  28 | singer     |
+----+---------+-----+------------+
8 rows in set (0.00 sec)

更新数据

在原有数据的基础上,修改原纪录中的数据。

语法结构:UPDATE table_name SET column_name1 = value, column_name2=value2,..,column_namen=valuen WHERE (condition);
//如果没condition,那就是对所有数据进行修改
mysql> SELECT * FROM person;
+----+---------+-----+------------+
| id | name    | age | info       |
+----+---------+-----+------------+
|  1 | Green   |  21 | Lawyer     |
|  2 | Willam  |  20 | sports man |
|  3 | Mary    |  24 | Musician   |
| 11 | Harry   |  20 | student    |
| 12 | Beckham |  31 | police     |
| 22 | Suse    |   2 | dancer     |
| 23 | Dale    |  22 | cook       |
| 24 | Edision |  28 | singer     |
+----+---------+-----+------------+
8 rows in set (0.00 sec)

mysql> UPDATE person SET age = 15, name = 'LiMing' WHERE id = 11;
Query OK, 1 row affected (0.10 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM person;
+----+---------+-----+------------+
| id | name    | age | info       |
+----+---------+-----+------------+
|  1 | Green   |  21 | Lawyer     |
|  2 | Willam  |  20 | sports man |
|  3 | Mary    |  24 | Musician   |
| 11 | LiMing  |  15 | student    |
| 12 | Beckham |  31 | police     |
| 22 | Suse    |   2 | dancer     |
| 23 | Dale    |  22 | cook       |
| 24 | Edision |  28 | singer     |
+----+---------+-----+------------+
8 rows in set (0.00 sec)

mysql> UPDATE person SET info = 'student' WHERE id BETWEEN 22 AND 24;
Query OK, 3 rows affected (0.05 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> SELECT * FROM person;
+----+---------+-----+------------+
| id | name    | age | info       |
+----+---------+-----+------------+
|  1 | Green   |  21 | Lawyer     |
|  2 | Willam  |  20 | sports man |
|  3 | Mary    |  24 | Musician   |
| 11 | LiMing  |  15 | student    |
| 12 | Beckham |  31 | police     |
| 22 | Suse    |   2 | student    |
| 23 | Dale    |  22 | student    |
| 24 | Edision |  28 | student    |
+----+---------+-----+------------+
8 rows in set (0.00 sec)

删除数据

语法格式:DELETE FROM table_name [WHERE <condition>];
[WHERE <condition>]为可选条件,若不选,则是删除所有记录。
mysql> SELECT * FROM person WHERE id = 11;
+----+--------+-----+---------+
| id | name   | age | info    |
+----+--------+-----+---------+
| 11 | LiMing |  15 | student |
+----+--------+-----+---------+
1 row in set (0.00 sec)

mysql> DELETE FROM person WHERE id = 11;
Query OK, 1 row affected (0.03 sec)

mysql> SELECT * FROM person WHERE id = 11;
Empty set (0.00 sec)

//删除多条记录
mysql> SELECT * FROM person;
+----+---------+-----+------------+
| id | name    | age | info       |
+----+---------+-----+------------+
|  1 | Green   |  21 | Lawyer     |
|  2 | Willam  |  20 | sports man |
|  3 | Mary    |  24 | Musician   |
| 11 | LiMing  |  15 | student    |
| 12 | Beckham |  31 | police     |
| 22 | Suse    |   2 | student    |
| 23 | Dale    |  22 | student    |
| 24 | Edision |  28 | student    |
+----+---------+-----+------------+
8 rows in set (0.00 sec)

mysql> DELETE FROM person WHERE id BETWEEN 22 AND 24;
Query OK, 3 rows affected (0.11 sec)

mysql> SELECT * FROM perso;
ERROR 1146 (42S02): Table 'ysh.perso' doesn't exist
mysql> SELECT * FROM person;
+----+---------+-----+------------+
| id | name    | age | info       |
+----+---------+-----+------------+
|  1 | Green   |  21 | Lawyer     |
|  2 | Willam  |  20 | sports man |
|  3 | Mary    |  24 | Musician   |
| 12 | Beckham |  31 | police     |
+----+---------+-----+------------+
4 rows in set (0.00 sec)

mysql> DELETE FROM person;
Query OK, 4 rows affected (0.12 sec)

//删除全部数据
mysql> SELECT * FROM person;
Empty set (0.00 sec)

为表增加计算列

什么是计算列?,就是通过别的列计算得来的列。

语法格式:col_name data_type [GENERATED ALWAYS] AS (experssion) [VIRTUAL | STORED] [UNIQUE [KEY]] [COMMENT conment] [NOT NULL | NULL] [[PRIMARY] KEY]


mysql> CREATE TABLE tb1
    -> (
    -> id INT NOT NULL AUTO_INCREMENT,
    -> a INT(9) DEFAULT NULL,
    -> b INT(9) DEFAULT NULL,
    -> c INT(9) GENERATED ALWAYS AS ((a+b)) VIRTUAL,
    -> PRIMARY KEY (`id`)
    -> );
Query OK, 0 rows affected (0.17 sec)

mysql> insert into tb1(a,b) VALUES (100,200);
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM tb1;
+----+------+------+------+
| id | a    | b    | c    |
+----+------+------+------+
|  1 |  100 |  200 |  300 |
+----+------+------+------+
1 row in set (0.00 sec)

mysql> UPDATE tb1 SET a = 500;
Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM tb1;
+----+------+------+------+
| id | a    | b    | c    |
+----+------+------+------+
|  1 |  500 |  200 |  700 |
+----+------+------+------+
1 row in set (0.00 sec)
[I/drv.emac] link down etharp_timer etharp_request: sending ARP request. pbuf_alloc(length=28) pbuf_alloc(length=28) == 0x2400d438 etharp_raw: sending raw ARP packet. pbuf_add_header: old 0x2400d458 new 0x2400d44a (14) ethernet_output: sending packet 0x2400d438 [W/drv.emac] eth transmit frame faild: 18 pbuf_free(0x2400d438) pbuf_free: deallocating 0x2400d438 etharp_timer [I/drv.emac] link down etharp_timer etharp_timer etharp_timer etharp_timer etharp_timer etharp_request: sending ARP request. pbuf_alloc(length=28) pbuf_alloc(length=28) == 0x2400d438 etharp_raw: sending raw ARP packet. pbuf_add_header: old 0x2400d458 new 0x2400d44a (14) ethernet_output: sending packet 0x2400d438 [W/drv.emac] eth transmit frame faild: 18 pbuf_free(0x2400d438) pbuf_free: deallocating 0x2400d438 etharp_timer [I/drv.emac] link down etharp_timer etharp_timer etharp_request: sending ARP request. pbuf_alloc(length=28) pbuf_alloc(length=28) == 0x2400d438 etharp_raw: sending raw ARP packet. pbuf_add_header: old 0x2400d458 new 0x2400d44a (14) ethernet_output: sending packet 0x2400d438 [W/drv.emac] eth transmit frame faild: 18 pbuf_free(0x2400d438) pbuf_free: deallocating 0x2400d438 etharp_timer [I/drv.emac] link down etharp_timer etharp_request: sending ARP request. pbuf_alloc(length=28) pbuf_alloc(length=28) == 0x2400d438 etharp_raw: sending raw ARP packet. pbuf_add_header: old 0x2400d458 new 0x2400d44a (14) ethernet_output: sending packet 0x2400d438 [W/drv.emac] eth transmit frame faild: 18 pbuf_free(0x2400d438) pbuf_free: deallocating 0x2400d438 etharp_timer [I/drv.emac] link down etharp_timer etharp_timer etharp_timer etharp_request: sending ARP request. pbuf_alloc(length=28) pbuf_alloc(length=28) == 0x2400d438 etharp_raw: sending raw ARP packet. pbuf_add_header: old 0x2400d458 new 0x2400d44a (14) ethernet_output: sending packet 0x2400d438 [W/drv.emac] eth transmit frame faild: 18 pbuf_free(0x2400d438) stm32h743+rtthread5.2.0+lwip+lan8720 以太网闪烁
03-11
<think>好的,我现在需要解决用户关于STM32H743使用RT-Thread 5.2.0和LWIP与LAN8720以太网模块连接时出现的网络链接问题,具体是链接断开和传输帧失败。首先,我应该从硬件连接和软件配置两方面来排查。 首先,硬件方面。LAN8720需要正确的电源和时钟配置。用户提到使用的是RMII接口,所以需要确认PHY的时钟源是否正确。LAN8720的nINTSEL引脚应该配置为使用外部晶振或者内部时钟模式。如果nINTSEL接高电平,则使用外部50MHz晶振,此时REF_CLK引脚应输出50MHz时钟给STM32的RMII_REF_CLK。如果接低电平,PHY需要接收来自STM32的50MHz时钟。这里可能有时钟配置错误,导致PHY无法正常工作,从而引发链接问题。需要检查硬件连接,特别是时钟线路是否正确,是否有信号干扰或电压不稳的情况。 然后是软件配置。RT-Thread的驱动是否正确支持LAN8720?需要确认在rtconfig.h中是否定义了PHY_USING_LAN8720A或者类似的宏。另外,PHY的地址是否正确,LAN8720的地址由PHYAD0引脚决定,默认可能是0或1,需与代码中的phy_addr一致。例如,如果PHYAD0接地,地址是0;接VDD则是1。检查驱动初始化时是否设置了正确的地址。 LWIP的配置也可能影响网络连接。需要确认内存池大小是否足够,比如PBUF_POOL_SIZE和PBUF_POOL_BUFSIZE是否设置合理。如果内存不足,可能导致数据包无法发送,出现传输失败。此外,检查LWIP的ARP表、超时设置,以及是否启用了DHCP或静态IP配置。如果使用静态IP,需确保IP、子网掩码、网关正确。 接下来是PHY状态检测。驱动中是否有定期读取PHY的状态寄存器(例如BSR)来监控链接状态?如果链接断开,可能需要重新初始化PHY或者调整自动协商设置。此外,检查PHY的复位引脚是否正确处理,确保在初始化时对PHY进行了正确的复位操作。 另外,中断处理可能也是一个问题。LAN8720的中断引脚是否连接到STM32,并在驱动中正确配置了中断服务函数?如果链接状态变化时没有触发中断,系统可能无法及时响应链接状态的变化,导致传输失败。 还有可能是硬件设计问题,比如RMII接口的走线是否满足信号完整性要求,是否有阻抗匹配问题,或者电源滤波不足导致PHY工作不稳定。这些需要检查PCB设计和电源电路。 最后,查看RT-Thread和LWIP的日志输出,是否有相关的错误信息,比如PHY初始化失败、发送超时等。调试时可以通过逐步排查,先确认PHY是否能正确被识别,再检查链路是否能够正常建立,最后排查数据传输的问题。 用户提供的引用中提到了stm32ai-windows-5.2.0的安装路径,可能涉及X-CUBE-AI的使用,但当前问题主要在网络驱动部分,可能与此工具无关,但如果有模型转换或AI相关功能可能会占用系统资源,需要确认是否影响了网络部分的性能。 总结下来,可能的解决步骤包括:检查硬件连接(尤其是时钟和复位线路)、确认驱动配置(PHY地址、时钟源)、调整LWIP参数、增加调试日志以定位具体错误点,以及验证PHY的状态寄存器的值。</think>针对STM32H743使用RT-Thread 5.2.0和LWIP与LAN8720以太网模块连接时出现的**网络链接断开(Link Down)及传输帧失败**问题,以下是分步解决方案: --- ### 一、硬件排查 1. **PHY时钟配置验证** LAN8720的RMII接口需要50MHz时钟输入。检查硬件设计中: - 若PHY的`nINTSEL`引脚接高电平,需外部提供50MHz晶振,且`REF_CLK`引脚输出时钟至STM32的`RMII_REF_CLK` - 若`nINTSEL`接低电平,需STM32输出50MHz时钟到PHY的`XTAL1`引脚 - 使用示波器测量时钟信号是否稳定,频率误差需小于±50ppm[^1] 2. **电源与复位电路** - 确保PHY的模拟电源(VDDA)和数字电源(VDD)电压为3.3V±5%,且滤波电容(如100nF)正确连接 - 检查复位引脚(RST)是否在启动时保持低电平至少10ms --- ### 二、软件配置调整 1. **RT-Thread驱动配置** 在`rtconfig.h`中确认以下宏定义: ```c #define BSP_USING_ETH #define PHY_USING_LAN8720A #define RT_LWIP_ETHTHREAD_PRIORITY 0x10 ``` 检查PHY地址(通常为0或1),需与硬件设计匹配: ```c phy_dev->addr = 0; // 若PHYAD0接地则为0,接VDD则为1 ``` 2. **LWIP参数优化** 修改`lwipopts.h`增加内存池大小: ```c #define PBUF_POOL_SIZE 16 #define PBUF_POOL_BUFSIZE 1524 #define MEM_SIZE (20*1024) ``` 调整ARP表项和超时设置: ```c #define ARP_TABLE_SIZE 10 #define ARP_MAXAGE 300 ``` --- ### 三、PHY状态诊断 1. **读取PHY寄存器** 在驱动中添加调试代码,读取关键寄存器: ```c uint16_t phy_status; phy_dev->read(phy_dev, 0, PHY_STATUS_REG, &phy_status); if (phy_status & PHY_LINK_STATUS) { rt_kprintf("PHY Link Up\n"); } else { rt_kprintf("PHY Link Down, status=0x%04X\n", phy_status); } ``` 若状态异常,检查自动协商设置: ```c phy_dev->write(phy_dev, 0, PHY_AUTONEG_ADVERT, 0x01E1); // 10/100M全双工 ``` --- ### 四、中断处理优化 1. **配置PHY中断引脚** 若使用中断模式: - 连接PHY的`nINT`引脚到STM32的GPIO - 在驱动中注册中断服务函数: ```c rt_pin_attach_irq(PHY_INT_PIN, PIN_IRQ_MODE_FALLING, phy_irq_handler, NULL); rt_pin_irq_enable(PHY_INT_PIN, PIN_IRQ_ENABLE); ``` --- ### 五、调试建议 1. **启用LWIP调试日志** 在`lwipopts.h`中开启调试输出: ```c #define ETHARP_DEBUG LWIP_DBG_ON #define NETIF_DEBUG LWIP_DBG_ON ``` 2. **检查DMA描述符对齐** STM32H743的ETH DMA要求描述符内存128字节对齐: ```c ALIGN(RT_ALIGN_SIZE) static rt_uint8_t rx_desc_buffer[...]; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值