在sql语句后使用 SCOPE_IDENTITY() 当然您也可以使用 SELECT @@IDENTITY 但是使用 SELECT @@IDENTITY是去全局最新. 有可能取得值不正确. 示例: 复制代码 代码如下:insert into dbo.SNS_BlogData(userName) values('jiangyun') ; SELECT SCOPE_IDENTITY() 获取SQL-SERVER数据库insert into操作的主键返回值,SCOPE_IDENTITY 插入一条记录后想要立刻获取其数据表中的主键返回值。这个主键是自动生成的,其实实现的方式有很多,比如再进行一次查询,获取出来。或者在插入数据之前取 出最大值,在最大值上面加一等等,方法很多,但是有些很不方便。 个人感觉最快的方式就是,在插入数据后直接获取主键的值,然后返回过来。 方法如下: sql语句如下: INSERT INTO tableName (fieldname ...) values (value ...) SELECT @@IDENTITY AS returnName; 在sql语句中加入SELECT @@IDENTITY AS returnName;用来获取主键的值 在程序中 获取返回值: 复制代码 代码如下: public int sqlexecutereader(string sql) { DBopen(); SqlCommand myComm = new SqlCommand(sql, Connection); int newID = Convert.ToInt32(myComm.ExecuteScalar()); DBclose(); return newID; } 当然在此处主键是int类型的自动增加的。DBopen();DBclose();的操作在此就 不多说了。 select SCOPE_IDENTITY() 返回上面操作的数据表最后row的IDENTITY 列的值; 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。 SELECT @@IDENTITY 返回上面操作最后一个数据表的最后row的IDENTITY 列的值; 创建表: create table T_User(F_ID int identity(1,1) not null,F_Name varchar(20) not null) 插入数据: insert into T_User(F_Name) values('我是谁') Select SCOPE_IDENTITY() 存储过程:

空mysqll表内容常见的有两种方法:一种delete,一种是truncate 。 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容。效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据。 其语法结构为: 复制代码 代码如下: TRUNCATE [TABLE] tbl_name 这里简单的给出个示例, 我想删除 friends 表中所有的记录,可以使用如下语句: 复制代码 代码如下: truncate table friends; delete的效果有点像将mysql表中所有记录一条一条删除到删完,而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表。 语法: delete语句的定义。 复制代码 代码如下: DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] MySQL的这些语法都和口语类似,你要指出你想从哪个表删除数据,还有删除哪些数据,这就够了。就像写记叙文的时候,时间、地点、人物、环境、情节几要素必不可少一样。 示例是最形象,最能说明问题的。所以,不整没用的了,直接进入主题。按照上面的语法结构,我想删除 firends 表中所有 user_name 等于 simaopig 的记录, 就可以使用如下SQL语句: 复制代码 代码如下: delete from friends where user_name = 'simaopig';delete 注意事项: 从语法结构中,我们就可以看出,和 update 语法一样,我们是可以省略 where 子句的。不过这是一个很危险的行为。因为如果不指定 where 子句,delete 将删除表中所有的记录,而且是立即删除,即使你想哭都没有地方,也没有时间,因为你需要马上和主管承认错误,并且立即找出MySQL日志,来回滚记录。不过一旦你有过一次这样的经历,我相信这一定是印象深刻的。 奇怪的是我在innodb上以及myisam上大数据量下,索引文件极大的情况下,几乎不可能删除成功!留待解决。 总结 不过truncate命令快规快,却不像delete命令那样对事务处理是安全的。因此,如果我们想要执行truncate删除的表正在进行事务处理,这个命令就会产生退出并产生错误信息。

本教程为大家分享了Linux安装MySQL详细步骤,供大家参考,具体内容如下第一步: 下载MySQL安装包进入mysql官网,进入download界面,选择自己需要的版本和操作平台,我的电脑是Centos 7。我这里操作系统选择linux Generic,版本选最新。(我觉得选红帽系统应该也行,因为CentOS 本来和红帽就差不多)你可以在windows环境下载到本地,再复制到linux目录下面,而这里我采用的是:直接在linux下使用以下指令下载[[email protected] ~]# wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz下载完成后显示这样:--2017-02-14 10:25:28-- https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz正在解析主机 cdn.mysql.com (cdn.mysql.com)... 104.124.241.153正在连接 cdn.mysql.com (cdn.mysql.com)|104.124.241.153|:443... 已连接。已发出 HTTP 请求,正在等待回应... 200 OK长度:641555814 (612M) [application/x-tar-gz]正在保存至: “mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz”100%[=============================================>] 641,555,814 865KB/s 用时 14m 36s2017-02-14 10:40:07 (715 KB/s) - 已保存 “mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz” [641555814/641555814])下载好后,从当前文件夹目录下将安装包移动到自己的家目录下。这样,在自己的家目录下就可以看到下载好的安装包。[[email protected] hhh]# lsa.out Documents mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz Templatesctest Downloads Pictures Videosc_test.c Hello7 PublicDesktop Music Python-3.4.3第二步: 创建用户组和用户,并解压安装包[[email protected] hhh]# groupadd mysql //创建Mysql用户组[[email protected] hhh]# useradd -g mysql mysql //创建系统用户mysql并将其加入到用户组mysql中[[email protected] hhh]# tar xzvf mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz //解压压缩包第三步: 创建符号链接在运行完解压缩命令之后,我们还需要创建一个由tar创建的在/usr/local/路径中的mysql符号链接。[[email protected] hhh]#ln -s /home/markpain/mysql-5.7.16-linux-glibc2.5-x86_64 /usr/local/mysql上面的命令创建了到/home/markpain/mysql-5.7.16-linux-glibc2.5-x86_64的链接/usr/local/mysql,mysql-5.7.16-linux-glibc2.5-x86_64是tar在/usr/local/目录下创建的子目录的真实名称。这个链接是必须的,因为MySQL默认的安装路径是/usr/local/mysql,默认的数据目录是/usr/local/mysql/data。值得注意的是,一些MySQL版本使用不同的目录作为默认安装目录,因此参阅MySQL的在线文档是非常重要的。到目前为止,MySQL已基本安装完成。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

sql语句:复制代码 代码如下:update item i,resource_library r,resource_review_link l set i.name=CONCAT('Review:',r.resource_name) where i.item_id=l.instance_id and l.level='item' and r.resource_id=l.resource_id and i.name='' JOIN UPDATE & JOIN DELETE 复制代码 代码如下: update a set a.schoolname = b.schoolname from tb_Std as a join tb_Sch as b on a.School = b.School where a.std_year = 2005 go /* (2 row(s) affected) */ select * from tb_Std as a join tb_Sch as b on a.School = b.School /* A School A A School 2 2005 A A School A A School 3 2004 C A School C C School 4 2005 D D School D D School (4 row(s) affected) */ 复制代码 代码如下: delete a from table1 a, table2 b where a.col1 = b.col1 and a.col2 = b.col2 The above SQL statement runs fine in SQL Server. If the Oracle 9i has different syntax or if there is any other way to accomplish this with a single delete statement that would be really helpful. > Hi, > > Is the following delete statement possible in Oracle 9i. > > delete a > from table1 a, table2 b > where a.col1 = b.col1 > and a.col2 = b.col2 > > The above SQL statement runs fine in SQL Server. > > If the Oracle 9i has different syntax or if there is any other way to accomplish this with a single delete statement that would be really helpful. > > Thanx in advance. > > -Bheem Bheem, Try this: DELETE FROM table1 a where exists (select 1 from table2 b where a.col1 = b.col1 and a.col2 = b.col2); Hope this helps,

感觉代码有些凌乱,注释代码都写的比较随意,好像没有什么统一的规范,不同的文件中代码风格也有差异,可能Mysql经过了很多牛人的手之后,集众牛人之长吧。也可能是我见识比较浅薄,适应了自己的代码风格,井底之蛙了,总之还是怀着敬畏的心情开始咱的源码之旅吧。本人菜鸟,大神轻拍。   Mysql可以启动起来了,应该怎么学习呢?总不能从main开始一步一步的看吧,Mysql作为比较底层的大型软件,涉及到数据库实现的方方面面,没有厚实的数据库理论基础和对Mysql各个模块相当的熟悉,从main开始势必会把自己引入某个死胡同啊,什么都看,最后啥也不会,咱伤不起。   经过思考后,我想还是通过客户端来调试服务器,从而学习服务器代码比较现实。也就是通过客户端的动作,看服务器的反应。比如从客户端的登录动作来看SERVER如何进行通信、用户识别、鉴定以及任务分配的,通过CREATE TABLE,来看SERVER如何解析DDL语句以及针对不同的存储引擎采取的不同的物理存储方式,通过INSERT语句,来看SERVER如何进行Btree的操作。通过SELECT语句来看如何进行SQL语句语法树的创建和优化的,通过ROLL BACK,来看SERVER事务是如何实现的。这里主要是通过跟踪代码学习Mysql数据库实现的思想,对于具体的代码不去做过多的追究(主要是我对C++不是很熟悉),好读书,不求甚解,呵呵。   由此,暂时准备了以下几条SQL语句,来有针对的进行SERVER的分析 复制代码 代码如下: 1、 LOGIN(登录) mysql.exe –uroot –p 2、 DDL(建表语句) create table tb_myisam(c1 int, c2 varchar(256)) engine = myisam; create table tb_innodb(c1 int, c2 varchar(256)) engine = innodb; 3、 INSERT Insert into tb_myisam values(1 , '寂寞的肥肉'); Insert into tb_innodb values(1 , '寂寞的肥肉'); 4、 SELECT Select c1 from tb_myisam; Select * from tb_innodb; 5、 ROLLBACK 大家都知道,mysql可以通过多个客户端,进行并发操作,当然也包括登录了。在别人登录的时候,其他的用户可能正在进行一些其它的操作,因此对于登录我们猜测应该有专门的线程负责客户端和服务器的连接的创建,以保证登录的及时性,对于每个连接的用户,应该用一个独立的线程进行任务的执行。   首先介绍下mysql中创建线程的函数,创建线程的函数貌似就是_begin_thread,CreateThread,我们通过VS在整个解决方案中进行查找,bingo!在my_winthread.c中找到了调用_begin_thread的函数pthread_create,在os0thread.c中找到了调用CreateThread的函数os_thread_create,一个系统怎么封装两个系统函数呢??再仔细看下,发现my_winthread.c是在项目mysys下,而os0thread.c是在项目innobase下。innobase!!这不就是innodb的插件式存储引擎么,原来这是存储引擎自己的封装的底层函数,哥心中豁然开朗了。我想Mysql应用范围如此之广,除了开源之外,插件式的存储引擎功不可没啊,用户可以根据自己的实际应用采取不同的存储引擎,对于大公司,估计会开发自己的存储引擎。   下面分析下pthread_create是如何调用_begin_thread的,先粗略看下源码。 复制代码 代码如下: int pthread_create(pthread_t *thread_id, pthread_attr_t *attr, pthread_handler func, void *param) { HANDLE hThread; struct pthread_map *map; DBUG_ENTER("pthread_create"); if (!(map=malloc(sizeof(*map)))) DBUG_RETURN(-1); map->func=func; map->param=param; pthread_mutex_lock(&THR_LOCK_thread); #ifdef __BORLANDC__ hThread=(HANDLE)_beginthread((void(_USERENTRY *)(void *)) pthread_start, attr->dwStackSize ? attr->dwStackSize : 65535, (void*) map); #else hThread=(HANDLE)_beginthread((void( __cdecl *)(void *)) pthread_start, attr->dwStackSize ? attr->dwStackSize : 65535, (void*) map); #endif DBUG_PRINT("info", ("hThread=%lu",(long) hThread)); *thread_id=map->pthreadself=hThread; pthread_mutex_unlock(&THR_LOCK_thread); if (hThread == (HANDLE) -1) { int error=errno; DBUG_PRINT("error", ("Can't create thread to handle request (error %d)",error)); DBUG_RETURN(error ? error : -1); } VOID(SetThreadPriority(hThread, attr->priority)) ; DBUG_RETURN(0); } 关键的代码是下面三句: 复制代码 代码如下: map->func=func; map->param=param; _beginthread((void( __cdecl *)(void *)) pthread_start, attr->dwStackSize ? attr->dwStackSize : 65535, (void*) map); 从这可以看出,创建的新线程的名字是个固定的函数——pthread_start,而我们传进来的想创建的函数func是挂载在了map上了,函数的参数同样的挂载在map上了,这样我们就可以推理出在pthread_start函数中,肯定会出现这样的代码:               map->func(map->param);   mysql没有选择直接_beginthread(func, stack_size, param)的形式,而是进行了一次封装,不知道这样的好处是什么,可能牛人的思想不是我这样小菜鸟能顿悟的,跑题了~~   至此,我们只在pthread_create函数上设置断点,调试启动mysqld,断点停下来,看下系统的线程状况: 我们第一次进入pthread_create,任何线程都没开始创建呢,按理说系统线程应该就只有一个主线程,可现在多了这么多,这些应该是innodb存储引擎创建的线程了(具体是在plugin_init)。根据线程的名称,结合注释,猜测了下这些线程的作用。    Io_handler_thread:从名称可以知道这些是I/O线程,负责进行磁盘I/O。 Svr_error_monitor_thread:应该是服务器出错监控线程。 Svr_lock_timeout_thread:应该是和上锁相关的线程。 Svr_master_thread: /************************************************************************* The master thread controlling the server. */ 服务器控制线程,应该是具体进行作业的线程。 Svr_monitor_thread: /************************************************************************* A thread prints the info output by various InnoDB monitors. */ 监控线程,负责打印信息。   淡然飘过吧,不去细究了,我们只关心pthread_create创建的线程。根据调试,发现多了几个线程同名的线程_threadstart,如下所示:   调试时看堆栈可以知道这三个线程的创建者和作用,如下所示创建者处理函数create_shutdown_threadhandle_shutdownstart_handle_managerhandle_managerhandle_connections_methodshandle_connections_sockets创建者:调用pthread_create进行创建线程的函数。   处理函数:调用pthread_create所创建的线程的具体的线程函数。   由名称我们就可以看出,handle_connections_sockets应该是处理连接的线程了,从顺序上看,也应该是这样,只有系统中所有的其他必须的线程创建完毕后,才能创建监听线程(连接线程),即监听线程应该是系统最后创建的。    找到了我们LOGIN需要的线程了,下次针对这个线程,分析下如何进行登录的,以及登录后为用户分配哪些资源。时间不早啦,洗洗睡了作者 :

分类:腾博会手机版下载

时间:2016-10-01 09:28:15