新足迹

 找回密码
 注册

精华好帖回顾

· 我家室外改造记(2)-前花园-Fence完工图36-38楼,前院小路尚未完工(更新) (2008-1-21) 淘淘 · K妈这个健身小白来分享一下三个月的健身总结 (2017-5-16) kevin妈妈
· 当微风如同飓风一般席卷足迹时---- 八一八我的使用心得 (2012-1-20) cathyyang · 爱折腾~之~rainwatertank安装实录(5月20日修订) (2007-5-18) AgeanSea
Advertisement
Advertisement
楼主:乱码

mysql 到底用不用store procedure? [复制链接]

头像被屏蔽

禁止访问

发表于 2011-1-12 23:44 |显示全部楼层
此文章由 kane2001 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kane2001 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2011-1-12 23:42 发表


对啊,如果我做一个insert query, 我没法得到这个primary key. 我感觉应该有什么机制会自动得到,但找不到这个方法。

可以用GUID
签名被屏蔽
Advertisement
Advertisement

发表于 2011-1-12 23:45 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-1-12 23:40 发表


没明白

用max(id)? or scope_identity?


max(id) 有一个时间差,就是你拿到的不一定是你insert的那个。

是scope_identity, 这个我们就是用sp来实现,我不知道有没有其他方法。
持不同股见者...

发表于 2011-1-12 23:46 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你是说@@identity?

原帖由 hornsay 于 12/1/2011 22:42 发表


对啊,如果我做一个insert query, 我没法得到这个primary key. 我感觉应该有什么机制会自动得到,但找不到这个方法。
If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表于 2011-1-12 23:47 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 北风 于 2011-1-12 23:46 发表
你是说@@identity?


对。
持不同股见者...

发表于 2011-1-12 23:50 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2011-1-12 23:45 发表


max(id) 有一个时间差,就是你拿到的不一定是你insert的那个。

是scope_identity, 这个我们就是用sp来实现,我不知道有没有其他方法。


scope_identity就是标准的用法,如果用@@identity,就是这个session当前的last identity values,没有scope的限制.

看看这篇文章,说得很清楚

http://msdn.microsoft.com/en-us/library/ms190315.aspx

评分

参与人数 1积分 +3 收起 理由
hornsay + 3 谢谢奉献

查看全部评分

发表于 2011-1-12 23:53 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
database强人北风出场了

估计月亮明天肯定回这个帖子。

没想到bulaohu也作database
Advertisement
Advertisement

发表于 2011-1-12 23:54 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 bulaohu 于 2011-1-12 23:52 发表


insert之后立刻select max(pri_key)不就行了?


还是会有一个gap. 如果是一个自动系统的话,那就完了。
持不同股见者...

发表于 2011-1-12 23:55 |显示全部楼层
此文章由 bulaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bulaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-1-12 23:53 发表
database强人北风出场了

估计月亮明天肯定回这个帖子。

没想到bulaohu也作database


我不是做DB的,很久以前做过web programmer,自己要写SQL,现在只是还记得一星半点而已

评分

参与人数 1积分 +3 收起 理由
乱码 + 3 记性很好啊!!

查看全部评分

发表于 2011-1-12 23:55 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
是的,有scope,不过我就是不喜欢function哈(paopaobing(3))

原帖由 乱码 于 12/1/2011 22:50 发表


scope_identity就是标准的用法,如果用@@identity,就是这个session当前的last identity values,没有scope的限制.

看看这篇文章,说得很清楚

http://msdn.microsoft.com/en-us/library/ms190315.aspx ...

评分

参与人数 1积分 +3 收起 理由
乱码 + 3 不复杂的系统我也混用

查看全部评分

If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表于 2011-1-12 23:59 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
晕倒,我就是一知半解的献丑

原帖由 乱码 于 12/1/2011 22:53 发表
database强人北风出场了

估计月亮明天肯定回这个帖子。

没想到bulaohu也作database
If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表于 2011-1-13 00:04 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-1-12 23:50 发表


scope_identity就是标准的用法,如果用@@identity,就是这个session当前的last identity values,没有scope的限制.

看看这篇文章,说得很清楚

http://msdn.microsoft.com/en-us/library/ms190315.aspx ...


在delphi里,一个query只能执行一个命令,不能把多个command 放在一个query里。大概.NET可以这么做。
持不同股见者...
Advertisement
Advertisement

发表于 2011-1-13 00:07 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2011-1-13 00:04 发表


在delphi里,一个query只能执行一个命令,不能把多个command 放在一个query里。大概.NET可以这么做。


还是没懂 我今天的理解力很有问题啊

发表于 2011-1-13 00:13 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-1-13 00:07 发表


还是没懂 我今天的理解力很有问题啊


这是MS 的sample:
INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
在delphi里,这3个command要分开来call,不知解释清楚了没有。
持不同股见者...

发表于 2011-1-13 00:21 |显示全部楼层
此文章由 bulaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bulaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2011-1-13 00:04 发表


在delphi里,一个query只能执行一个命令,不能把多个command 放在一个query里。大概.NET可以这么做。


只要你不disconnect session,那么session variable应该仍然有效,这样分成多个command也没关系

评分

参与人数 1积分 +3 收起 理由
hornsay + 3 谢谢奉献

查看全部评分

发表于 2011-1-13 00:22 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2011-1-13 00:13 发表


这是MS 的sample:
INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
在delphi里,这3个comman ...


明白了,其实它也是run了3次,go是client的命令,送batch到db那边去run,go几次就是送了几次,你的例子是分别送3个batch过去run,其实一个go就可以。

http://msdn.microsoft.com/en-us/library/ms188037.aspx

[ 本帖最后由 乱码 于 2011-1-13 00:24 编辑 ]

评分

参与人数 1积分 +3 收起 理由
hornsay + 3 感谢分享

查看全部评分

发表于 2011-1-13 00:25 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 bulaohu 于 2011-1-13 00:21 发表


只要你不disconnect session,那么session variable应该仍然有效,这样分成多个command也没关系


谢谢。明天去试一下。

现在我们全是用sp来实现的。
持不同股见者...
Advertisement
Advertisement

发表于 2011-1-13 00:28 |显示全部楼层

回复 45# 的帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Sorry 把你的楼给歪了。

发表于 2011-1-13 00:29 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2011-1-13 00:28 发表
Sorry 把你的楼给歪了。


没关系,大家聊聊天,我一点不介意 :)

觉觉去了,good night!!!

发表于 2011-1-13 00:32 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
good night.

发表于 2011-1-13 07:15 |显示全部楼层
此文章由 不会游泳的鱼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 不会游泳的鱼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2011-1-12 23:33 发表


对,就是这个identity. 通常我们是用sp去拿到它。想请教一下有什么其它方法去得到它?

php有function去取刚插入的记录id的

当年我们公司的网站完工后有600多个SP,开发公司走了,我们就杯具了。在MVC模式下,应该不怎么需要SP了吧?
最简单的下载Youtube视频方法:在视频页面地址栏的“youtube”和“.com”之间输入“-saver”,就可以直接把视频下载到硬盘里。

发表于 2011-1-13 09:08 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-1-12 23:17 发表


如果你做几天dba/db developer可能就会改变看法。orm tool只有部分app dev team当宝,这种team普遍运用sql的能力都比较弱,但接受新事物的能力比较强。

如果比较刺耳你别介意阿,你知道我不是有心的,只是讨论问题 bbxt41 ...


dba 有做开发的吗? 如果就做点这个, 不担责任, 估计没人给 100/hour 的起薪了

对呀!正是因为数据库的生存时间比app长,所以才不能使用sp做逻辑,从asp走过来的人估计都知道,asp2.0,3.0的标准开始的时候全部都是sp的逻辑,只要给张纸画上控件,上面写上哪个调用哪个sp就可以了,所以无聊的OO程序员才会想到用vbscript写"类",用xml做载体,用xslt生成presentation,后来迁移到.net,很多sp都"冗余"了,你死一个应用,数据库就留下一堆遗骸,php就做的很不错,microsoft才认识到这是个问题.

还有如果程序员可以任意操作数据库的类似"作坊式"开发只适合小型或者中型的应用或者网站,很多雇主的数据对开发人员是屏蔽的,dba 干dba的事,不然要dba干吗?数据库在dmz里面,企业级架构针对不同的应用提供不同的形式的数据,不然一个 Enterprise Architect 20万的年薪给喝茶的,这个不是一个技术强的 senior 开发者能理解的,需要足够的时间和经验去上凳次.

用什么approach没有什么能力强与弱考虑,没有什么good or bad practice的问题,对商业软件的提供商来说胡悠了你才好卖东西,应用取决于你的需求.我现在用sp最多就是为了做BI/reports,这个实在是脱离不了sp,是最好的选择.

最后,我不介意,我早就强调100遍了,我就是"junior in junior".

评分

参与人数 1积分 +3 收起 理由
乱码 + 3 感谢分享

查看全部评分

Advertisement
Advertisement

发表于 2011-1-13 09:23 |显示全部楼层
此文章由 IsDonIsGood 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 IsDonIsGood 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2011-1-12 23:42 发表


对啊,如果我做一个insert query, 我没法得到这个primary key. 我感觉应该有什么机制会自动得到,但找不到这个方法。


用scope_identity()抓insert的primary key,最安全,不然会抓到别的insert query产生的primary key

特殊贡献奖章

发表于 2011-1-13 09:32 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这帖火啊
不过还是讨论到sql server上去了

发表于 2011-1-13 09:38 |显示全部楼层
此文章由 多情圣手 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 多情圣手 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 coolioo 于 2011-1-12 22:54 发表
写SP有一个问题,就是如何进行版本控制??乱码兄能谈谈经验吗?



可以用Microsoft Visual SourceSafe

发表于 2011-1-13 09:57 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 Dan.and.Andy 于 2011-1-13 09:08 发表


dba 有做开发的吗? 如果就做点这个, 不担责任, 估计没人给 100/hour 的起薪了

对呀!正是因为数据库的生存时间比app长,所以才不能使用sp做逻辑,从asp走过来的人估计都知道,asp2.0,3.0的标准开始的时候全部都是sp的 ...


Dan.and.Andy,first of all, u r not "junior in junior",看看你做的jQuery plug in就知道了,没有几年实打实的真功夫,根本做不出来那个的,我就没这个能力   honestly, u r "senior in senior" :)

我说DBA的意思是在这个位置上,能更好的理解database的理念,根据project的nature,应用最好的approach,根开发到没什么关系。不过其中一个dba的responsibility是给db developer作code review,他们即使不真正的写code,也要对业务很熟的。

business logic要跟寿命长的部分,跟了寿命短的,一旦app overhaul或者转平台(如果真有这种可能的话),这些logic就要重新写,但也有例外,如果做成web service的方式,可能就不用重写,这里的web service也就是跟sp一个意思,都是expose api给别人用的。

一个应用死了,讲到留遗骸,app layer留的应该是sp的几倍.sp如果不做成generic的话,很简单,input/output而已,而且很少有人做分层的sp,如果用好的naming convention,删了它们是分分钟的事,不过很多dba为保险起见,不愿意这么做而已。

用什么approach是技术人员说了算,其中project的规模/maintainability/scalability/和team member现有的skill set,技术人员要有市场的idea,但以上的几个checkpoints技术上不能保证的话,这个产品可能有市场,但商业上不会很成功,除非它是独一家,没有竞争对手。

不知道我说清楚了没有 

发表于 2011-1-13 09:58 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 不会游泳的鱼 于 2011-1-13 07:15 发表

php有function去取刚插入的记录id的

当年我们公司的网站完工后有600多个SP,开发公司走了,我们就杯具了。在MVC模式下,应该不怎么需要SP了吧?


mvc跟data access没关系,有什么尽管用。
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2011-1-13 10:03 |显示全部楼层

Stored procedure comparison with dynamic SQL

此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
http://en.wikipedia.org/wiki/Sto ... on_with_dynamic_SQL

Overhead: Because stored procedure statements are stored directly in the database, they may remove all or part of the compilation overhead that is typically required in situations where software applications send inline (dynamic) SQL queries to a database. (However, most database systems implement "statement caches" and other mechanisms to avoid repetitive compilation of dynamic SQL statements.) In addition, while they avoid some overhead, pre-compiled SQL statements add to the complexity of creating an optimal execution plan because not all arguments of the SQL statement are supplied at compile time. Depending on the specific database implementation and configuration, mixed performance results will be seen from stored procedures versus generic queries or user defined functions.
Avoidance of network traffic: A major advantage with stored procedures is that they can run directly within the database engine. In a production system, this typically means that the procedures run entirely on a specialized database server, which has direct access to the data being accessed. The benefit here is that network communication costs can be avoided completely. This becomes particularly important for complex series of SQL statements.
Encapsulation of business logic: Stored procedures allow for business logic to be embedded as an API in the database, which can simplify data management and reduce the need to encode the logic elsewhere in client programs. This may result in a lesser likelihood of data becoming corrupted through the use of faulty client programs. The database system can ensure data integrity and consistency with the help of stored procedures.
Delegation of access-rights: In many systems, stored-procedures can be granted access rights to the database which the users who will execute those procedures do not directly have.
Some protection from SQL injection attacks: Stored procedures can be used to protect against injection attacks. Stored procedure parameters will be treated as data even if an attacker inserts SQL commands. Also, some DBMSs will check the parameter's type.

评分

参与人数 1积分 +3 收起 理由
乱码 + 3 谢谢奉献

查看全部评分

签名被屏蔽

发表于 2011-1-13 11:27 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
For inserted number
you can use output,
For example,
insert many lines using a query, with output, you can get what you inserted, not only the id.

发表于 2011-1-13 11:49 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我来说说 PHP 和 MySQL:

One Man Show / Opensource 一般都用dynamic sql, 有时有ORM衬地,方便简单,快。 Inhouse App Development 就会用SP,稳定+工作分明(frondend, backend).

好与坏很难说,见仁见智。DynamicSQL 如果处理得好,很难被Inject的,要不那些opensource的早就完蛋了。

评分

参与人数 1积分 +3 收起 理由
乱码 + 3 谢谢奉献

查看全部评分

特殊贡献奖章

发表于 2011-1-13 12:06 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
sql injection 很容易防,也很容易留下漏洞。dynamic的话,更改的多,经手人多就容易留下漏洞。
opensource的好处是用户多,发现问题快
很多著名的project都有过sql injection的漏洞。堵上就行。

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部