SQL SERVER触发器详细讲解带有实例

触发器

触发器:即当发生某一事件时,如果满足给定条件,则执行相应的动作。

基本架构:

在这里插入图片描述

触发器的简介:

触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。
触发器可以查询其他表,而且可以包含复杂的sql语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。

触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。

触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。

此外触发器是逻辑电路的基本单元电路,具有记忆功能,可用于二进制数据储存,记忆信息等。

------来源于百度百科

触发器的作用:

可在写入数据表前,强制检验或转换数据。
触发器发生错误时,异动的结果会被撤销。
部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
可依照特定的情况,替换异动的指令 (INSTEAD OF)。

触发器的优点:

触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制用比CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。

慎用触发器:

触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作…… 同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。
SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。
这两个表由系统来维护,它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行 完成后,与该触发器相关的这两个表也被删除。
  Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
  Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。

Instead of 和 After触发器

SQL Server2000提供了两种触发器:Instead of 和After 触发器。这两种触发器的差别在于他们被激活的不同:
  Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外,Instead of 触发器也可以用于视图,用来扩展视图可以支持的更新操作。
  After触发器在一个Insert,Update或Deleted语句之后执行,进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。
  一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器,一个表的每个修改动作都可以有多个After触发器。

触发器的执行过程

如果一个Insert﹑update或者delete语句违反了约束,那幺After触发器不会执行,因为对约束的检查是在After触发器被激活之前发生的。所以After触发器不能超越约束。
  Instead of 触发器可以取代激活它的操作来执行。它在Inserted表和Deleted表刚刚建立,其它任何操作还没有发生时被执行。因为Instead of 触发器在约束之前执行,所以它可以对约束进行一些预处理。

基本语句如下:

create trigger trigger_name
​
  on {table_name | view_name}
​
  {for | After | Instead of }
​
  [ insert, update,delete ]
​
  as
​
  sql_statement

删除触发器:

drop trigger trigger_name

查看数据库中已有触发器:
 – 查看数据库已有触发器

use jxcSoftware
​
  go
​
  select * from sysobjects where xtype='TR'

– 查看单个触发器

exec sp_helptext '触发器名'

修改触发器:
基本语句如下:

alter trigger trigger_name
​
  on {table_name | view_name}
​
  {for | After | Instead of }
​
  [ insert, update,delete ]
​
  as
​
  sql_statement

注:(不同数据库支持不同的类型触发器,有些还支持before类型触发器,像SQL server 就不支持before触发器

SQL Server 支持两种类型的触发器AFTER 触发器和INSTEAD OF 触发器,其中AFTER 触发器要求只有执行某一操作ISERT, UPDATE ,DELETE 之后触发器才被触发。
1)INSTEAD OF 触发器表示并不执行其所定义的操作INSERT,UPDATE ,DELETE,而仅是执行触发器本身,既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器。

2)after 触发器(也叫“FOR”触发器)则会在触发 insert、update 或是delete 动作之后执行。触发事件分为三类:UPDATE、DELETE和INSERT。

另外,定义触发器时,系统都都会自动生成两张表INSERTED和DELETED,我们是可以直接用的,如下:
DML 触发器有两个特殊的表:插入表(instered)和删除表(deleted),这两张表是逻辑表。这两个表是建立在数据库服务器的内存中,而且两张表的都是只读的。这两张表的结构和触发器所在的数据表的结构是一样的。当触发器完成工作后,这两张表就会被删除。Inserted 表的数据是插入或是修改后的数据,而 deleted 表的数据是更新前的或是已删除的数据。

在这里插入图片描述

也可以用百度网盘了:链接:https://pan.baidu.com/s/1gtlSrhQSBAd1rblrmU3JiA 提取码:q79b

实例

1.在表Student中建立删除触发器,实现表Student和表SC的级联删除,也就是只要删除表Student
中的元组学号为s1,则表SC中SNO为s1的元组也要删除;建立完触发器后用企业管理器删除Student中学号
为30的元组,看看表SC中SNO为30的选课记录是否也一起删除;
 
create trigger t_std2 on student
instead of  delete
as
begin
  declare @id char(5)
  select @id=sno from deleted
  delete from sc where SNo =@id
  delete from student where SNo=@id
  end
  go
 
delete from Student where SNo='00002'
2.	在表Course中增加一个职业规划选修课,为(005,职业规划,4,0014),在表SC中建立一个触发器,
实现规定年龄24岁以上(包括24岁)的学生才能选修职业规划这门课程,如果年龄小于24岁,则输出’
年龄小于24,不能选修该门课程’,插入失败,用SQL语句在SC表中分别插入(‘00001’,’005’,null)(‘00005’,’005’,null)看看结果;**/
create trigger t_sc on sc
for insert
as
begin
  declare @id char(5)
  select @id=sno from inserted
  if((select cno from inserted)='005' and (select sage from student where SNo= @id )<24)
  begin
  print '年龄小于24,不能选修该门课程 '
  rollback transaction
  end
  else
   print 'nice!'
   end
insert into course values('005','职业规划','4','0014')
insert into sc values('00001','005',null)
insert into sc values('00005','005',null)
select * from sc
go
3.在表SC中建立更改触发器,实现表SC中的修改后的成绩不能低于修改前的成绩,
如果修改后的成绩低于修改前的成绩,则输出’修改后的成绩比修改前低,不能修改’,
修改失败,用SQL语句把学号为00001,课程号为001的成绩分别改为90和70,看看结果;
 
createtrigger t2_sc on sc
after update
as
if(update(score))
begin
  declare @score1 numeric(3,1),@score2numeric(3,1)
  select @score1=score from inserted
  select @score2=score from deleted
  if(@score1>@score2 )
   print 'nice! '
   else
    update sc
    set sc.Score=@score2 from sc,deleted
    where sc.SNo=deleted.SNo andsc.CNo=deleted.CNo
    print '失败'
    end
update sc
    setScore=70 where SNo='00001' and CNo='001' 
4.	在表Teacher中创建触发器,实现如果更新了表Teacher中的年龄和工资,
则输出’更新了年龄和工资’,如果更新了年龄没有更新工资,则输出’更新了年龄’,
如果更新了工资而没有更新年龄,则输出’更新了工资’,创建完后使用SQL语句把
tno为001的年龄加1,把tno为002的工资加1,把tno为003的年龄和工资都加1,看看结果;
create trigger t_teacher on teacher
after update
as
begin
  declare @age int,@sal float
  select @age=age from deleted
  select @sal=sal from deleted
  if(@age <> (select age from inserted )and @sal <>(select sal from inserted))
  print '更新了年龄和工资 '
  else if(@age <> (select age from inserted )and @sal =(select sal from inserted))
  print '更新了工资 '
  else if(@age = (select age from inserted )and @sal <>(select sal from inserted))
   print '更新了年龄 '
   end
 
   update Teacher
   set age=age+1 where Tno='0001'
5.	在不删除触发器的前提下,使3创建的触发器无效;
alter table teacher disable trigger t_teacher
6.	创建一个名为tri_Delete_C的触发器,要求首先判断数据库中是否已经存在名为
tri_Delete_C的触发器,如果存在,首先删除,再创建,触发器要求删除一门课程时
候,首先判断该课程有否有人选,如果有人选,则不能删除,并通过测试数据验证触
发器的执行情况。
if(exists (select * from  sysobjects where xtype='tr' and name='tri_Delete_C'))
begin
  drop trigger tri_Delete_C
  print '已删除'
  end
  go
  create trigger tri_Delete_C on course
   for delete
    as	
	begin
	if exists (select * from sc inner join deleted on sc.CNo=deleted.CNo)
	begin
	  print '不能删除'
	  rollback transaction
	end
	end
	go
	alter table sc drop constraint FK__sc__CNo__08B54D69
	delete course where CNo='001'
	alter table sc add constraint FK__sc__CNo__08B54D69 foreign key(cno) references course(cno) 

SQL触发器中的deleted表和inserted表

在触发器语句中用两个特殊的表一个是deleted表和inserted。它们是通过触发器操作自动创建驻留在内存中的临时表。

描述:

Deleted表用于存储 DELETE和 UPDATE语句所影响的行的副本。在执行DELETE或 UPDATE语句时,行从触发器表中删除,并传输到 deleted表中。Deleted表和触发器表通常没有相同的行。

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。

综上可以总结一下:

触发器的操作deleted表和inserted表的数据变化
插入操作(Insert)Inserted表有数据,Deleted表无数据
删除操作(Delete)Inserted表无数据,Deleted表有数据
更新操作(Update)Inserted表有数据(新数据),Deleted表有数据(旧数据)

实践:

举个例子如果现在有两张表,一个是课程表T_course,还有一个学生表T_student。课程表中的课程和学生是一对多的关系。如下图中的关系。

在这里插入图片描述

从图中可以看出课程表T_course和学生表T_student有主外键的关系,也就是说当我删除课程表中的某个课程时,必须先要删除上这门课的所有学生。这就可以利用触发器来实现:其中就要通过deleted表来查询要删除的课程号。

ALTER TRIGGER [dbo].[tri_courseDelete]
   ON  [dbo].[T_course]
   instead of  DELETE
AS 
BEGIN
	declare @courseId varchar(50) --定义课程号变量。
	--在deleted表中查询要删除的课程号
	select @courseId=courseId from deleted
	--删除上这门课的学生
	delete T_student where courseId=@courseId
	--删除这门课
	delete T_cousrse where courseId=@courseId
END
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 SQL必知必会(第3版) 基本信息 原书名: Sams Teach Yourself SQL in 10 Minutes, Third Edition 原出版社: Sams 作者: (美)Ben Forta 译者: 钟鸣 刘晓霞 丛书名: 图灵程序设计丛书 数据库 出版社:人民邮电出版社 ISBN:9787115162601 上架时间:2007-6-22 出版日期:2007 年7月 开本:32开 页码:204 版次:3-1 所属分类: 计算机 > 数据库 > SQL语言 编辑推荐   SQL经典畅销书    涵盖所有主流数据库    学习与参考皆宜... 内容简介   sql 是目前使用最为广泛的数据库语言之一。本书没有涉及理论,而是从实践出发,由浅入深地讲解了广大读者所必需的sql 知识,适用于各种主流数据库。实例丰富,便于查阅。本书涉及不同平台上数据的排序、过滤和分组,以及表、视图、联结、子查询、游标、存储过程和触发器等内容,通过本书读者可以系统地学习到sql 的知识和方法。    本书注重实用性,操作性很强,适合于sql 的初学者学习和广大软件开发及管理人员参考。 作译者    作者: (美)Ben Forta Ben Forta是世界知名的技术作家,也是Adobe技术界最为知名的专家之一,目前担任Adobe公司的高级技术推广专家。他具有计算机行业20多年工作经验,多年来撰写了十几本技术图书,其中不少是世界畅销书,已被翻译为十几种文字。除本书外,他撰写的《正则表达式必知必会》也即将由人民邮电出版社出版。读者可以通过他的个人网站http://www.forta.com了解更多信息。 目录 封面 -14 常用操作速查 -13 扉页 -11 版权 -10 版权声明 -9 前言 -8 致谢 -5 目录 -4 第1章 了解SQL 1 1.1 数据库基础 1 1.1.1 什么是数据库 2 1.1.2 表 2 1.1.3 列和数据类型 3 1.1.4 行 4 1.1.5 主键 4 1.2 什么是SQL 5 1.3 动手实践 6 1.4 小结 7 第2章 检索数据 8 2.1 SELECT语句 8 2.2 检索单个列 9 2.3 检索多个列 10 2.4 检索所有列 11 2.5 小结 12 第3章 排序检索数据 13 3.1 排序数据 13 3.2 按多个列排序 15 3.3 按列位置排序 15 3.4 指定排序方向 16 3.5 小结 18 第4章 过滤数据 19 4.1 使用WHERE子句 19 4.2 WHERE子句操作符 20 4.2.1 检查单个值 21 4.2.2 不匹配检查 22 4.2.3 范围值检查 22 4.2.4 空值检查 23 4.3 小结 24 第5章 高级数据过滤 25 5.1 组合WHERE子句 25 5.1.1 AND操作符 25 5.1.2 OR操作符 26 5.1.3 计算次序 26 5.2 IN操作符 28 5.3 NOT操作符 29 5.4 小结 30 第6章 用通配符进行过滤 31 6.1 LIKE操作符 31 6.1.1 百分号(%)通配符 32 6.1.2 下划线(_)通配符 33 6.1.3 方括号([ ])通配符 34 6.2 使用通配符的技巧 36 6.3 小结 36 第7章 创建计算字段 37 7.1 计算字段 37 7.2 拼接字段 38 7.3 执行算术计算 42 7.4 小结 43 第8章 使用数据处理函数 44 8.1 函数 44 8.2 使用函数 45 8.2.1 文本处理函数 46 8.2.2 日期和时间处理函数 47 8.2.3 数值处理函数 50 8.3 小结 50 第9章 汇总数据 51 9.1 聚集函数 51 9.1.1 AVG()函数 52 9.1.2 COUNT()函数 53 9.1.3 MAX()函数 54 9.1.4 MIN()函数 54 9.1.5 SUM()函数 55 9.2 聚集不同值 56 9.3 组合聚集函数 57 9.4 小结 58 第10章 分组数据 59 10.1 数据分组 59 10.2 创建分组 59 10.3 过滤分组 61 10.4 分组和排序 63 10.5 SELECT子句顺序 65 10.6 小结 65 第11章 使用子查询 66 11.1 子查询 66 11.2 利用子查询进行过滤 66 11.3 作为计算字段使用子查询 69 11.4 小结 71 第12章 联结表 72 12.1 联结 72 12.1.1 关系表 72 12.1.2 为什么要使用联结 74 12.2 创建联结 74 12.2.1 WHERE子句的重要性 75 12.2.2 内部联结 77 12.2.3 联结多个表 78 12.3 小结 80 第13章 创建高级联结 81 13.1 使用表别名 81 13.2 使用不同类型的联结 82 13.2.1 自联结 82 13.2.2 自然联结 84 13.2.3 外部联结 84 13.3 使用带聚集函数的联结 87 13.4 使用联结和联结条件 88 13.5 小结 88 第14章 组合查询 89 14.1 组合查询 89 14.2 创建组合查询 89 14.2.1 使用UNION 90 14.2.2 UNION规则 91 14.2.3 包含或取消重复的行 92 14.2.4 对组合查询结果排序 93 14.3 小结 94 第15章 插入数据 95 15.1 数据插入 95 15.1.1 插入完整的行 95 15.1.2 插入部分行 98 15.1.3 插入检索出的数据 99 15.2 从一个表复制到另一个表 100 15.3 小结 101 第16章 更新和删除数据 102 16.1 更新数据 102 16.2 删除数据 104 16.3 更新和删除的指导原则 105 16.4 小结 106 第17章 创建和操纵表 107 17.1 创建表 107 17.1.1 表创建基础 108 17.1.2 使用NULL值 109 17.1.3 指定默认值 110 17.2 更新表 111 17.3 删除表 113 17.4 重命名表 113 17.5 小结 114 第18章 使用视图 115 18.1 视图 115 18.1.1 为什么使用视图 116 18.1.2 视图的规则和限制 117 18.2 创建视图 118 18.2.1 利用视图简化复杂的联结 118 18.2.2 用视图重新格式化检索出的数据 119 18.2.3 用视图过滤不想要的数据 121 18.2.4 使用视图与计算字段 121 18.3 小结 122 第19章 使用存储过程 123 19.1 存储过程 123 19.2 为什么要使用存储过程 124 19.3 执行存储过程 125 19.4 创建存储过程 126 19.5 小结 129 第20章 管理事务处理 130 20.1 事务处理 130 20.2 控制事务处理 132 20.2.1 使用ROLLBACK 133 20.2.2 使用COMMIT 133 20.2.3 使用保留点 134 20.3 小结 135 第21章 使用游标 136 21.1 游标 136 21.2 使用游标 137 21.2.1 创建游标 138 21.2.2 使用游标 138 21.2.3 关闭游标 140 21.3 小结 141 第22章 了解高级SQL特性 142 22.1 约束 142 22.1.1 主键 143 22.1.2 外键 144 22.1.3 唯一约束 145 22.1.4 检查约束 146 22.2 索引 147 22.3 触发器 149 22.4 数据库安全 150 22.5 小结 151 附录A 样例表脚本 152 A.1 样例表 152 A.2 获得样例表 155 A.2.1 下载可供使用的Microsoft Access MDB文件 155 A.2.2 下载DBMS SQL脚本 155 附录B 流行的应用系统 157 B.1 使用Aqua Data Studio 157 B.2 使用DB2 158 B.3 使用Macromedia ColdFusion 159 B.4 使用Microsoft Access 159 B.5 使用Microsoft ASP 160 B.6 使用Microsoft ASP.NET 161 B.7 使用Microsoft Query 161 B.8 使用Microsoft SQL Server 162 B.9 使用MySQL 163 B.10 使用Oracle 163 B.11 使用PHP 164 B.12 使用PostgreSQL 164 B.13 使用Query Tool 164 B.14 使用Sybase 165 B.15 配置ODBC数据源 165 附录C SQL语句的语法 167 C.1 ALTER TABLE 167 C.2 COMMIT 167 C.3 CREATE INDEX 168 C.4 CREATE PROCEDURE 168 C.5 CREATE TABLE 168 C.6 CREATE VIEW 168 C.7 DELETE 169 C.8 DROP 169 C.9 INSERT 169 C.10 INSERT SELECT 169 C.11 ROLLBACK 169 C.12 SELECT 170 C.13 UPDATE 170 附录D SQL数据类型 171 D.1 串数据类型 172 D.2 数值数据类型 173 D.3 日期和时间数据类型 174 D.4 二进制数据类型 175 附录E SQL保留字 176 索引 182 前言   SQL是使用最为广泛的数据库语言之一。不管你是应用开发人员、数据库管理人员、Web应用设计人员,还是Microsoft Office用户,掌握良好的SQL知识对于与数据库打交道是很重要的。.   本书可以说是应需而生。我曾经讲授过多年的Web应用开发,学生们经常要求我推荐有关SQL的图书。SQL方面的图书有许多,有的其实很不错,但它们都有一个共同的特点,就是对于大多数读者来说,它们所讲授的内容太多了。大多数书籍讲授的不是SQL本身,而是从数据库设计、规范化到关系数据库理论以及相关管理等所有内容。当然,这些内容都很重要,但并不是大多数仅想学习SQL的读者所感兴趣的。   因此,在找不到合适的书籍推荐给学生的情况下,我把在课堂上给学生讲授的SQL知识汇编成了本书。本书将讲授读者需要了解的SQL知识,我们从简单的数据检索入手,然后再介绍一些较为复杂的内容,如联结、子查询、存储过程、游标、触发器以及表约束等。读者将从本书中循序渐进、系统、直接地学到SQL的知识和技巧。   这是本书的第3版,它已经教会了成千上万的读者使用SQL。现在轮到你了,让我们翻到第1章,开始学习吧。你将很快编写出世界级的SQL。   读者对象   本书适合以下读者:   SQL新手;   希望快速学会使用SQL;   希望知道如何在应用程序开发中使用SQL;   希望在无人帮助的情况下有效快速地使用SQL。   本书涵盖的DBMS   一般来说,本书中所讲授的SQL可以应用到任何数据库管理系统(DBMS)。但是,因为所有SQL实现并不都是相同的,所以本书介绍的SQL主要适用于以下系统(需要时会给出特定的说明和注释):   IBM DB2;   Microsoft Access;..   Microsoft SQL Server;   MySQL;   Oracle;   PostgreSQL;   Sybase Adaptive Server。   本书中所有数据库和SQL脚本例子对于这些DBMS都是适用的。 .  本书约定   本书采用等宽字体表示代码,读者输入的文本与应该出现在屏幕上的文本也以等宽字型给出。如:   It will look like this to mimic the way text looks on your screen.   代码行前的箭头( )表示行中代码太长,该行容纳不下。在 符号后输入的所有字符都应该是前一行的内容。   说明:给出上下文讨论中比较重要的信息。      提示:为某任务给出建议或一种更简单的方法。      注意:提醒可能出现的问题,避免出现事故。      新术语,提供新的基本词汇的清晰定义。   表示读者可以自己输入的代码。   强调某个程序执行时的输出。   告诉读者将对程序代码进行逐行分析。...   
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值