This topic has been archived. It cannot be replied.
-
工作学习 / 专业技术讨论 / 请教一个SQL语句数据表中主键字段(假设叫ID)是自增的整数. 在insert一个记录后, 想知道刚插入的记录的该字段的值. 在Oracle PL/SQL有INSERT INTO Table1(...) VALUES (...) RETURNING ...语句. 我想知道如果用纯SQL语句怎么写? 在Oracle 和蔼SQL Server中. 谢谢.
-xm1223(andy);
2006-12-6
{228}
(#3361431@0)
-
select max(id) from table ?
-hard20(hard20);
2006-12-6
(#3361437@0)
-
显然不对,你怎么保证你插入和查询之间没有其他人插入?除非你lock这个table,但这肯定也不是好主意。俺的做法,俺从来不用自增ID,从一个sequence取ID插进去,你永远知道你插的ID。不知道有没有更好的办法
-maplew2008(call me at 911);
2006-12-6
{22}
(#3361455@0)
-
你的办法更糟糕。你如何保证同样的逻辑,别人取得不是同样的sequence,而且更糟的是,比你抢先一步插入。轮到你的时候就fail掉了。象你所说的这种情况,解决方法不是不用自增ID,而是要用Transaction Lock。在你插入和读取@@identity的时候,其它插入操作必须等待。
-bdbs(不多不少);
2006-12-6
(#3362120@0)
-
怎么可能,从sequence里取值,怎么可能取出相同的,那还叫sequence?取出的值是identical的,谁爱先插爱后插爱不插,怎么可能重呢?sequence怎么实现的另说啊,可以用Oracle的sequence,可以自己做处理
-maplew2008(call me at 911);
2006-12-6
{64}
(#3362142@0)
-
关键部分另说?那不是说了白说?:)照你的思路,MS SQL里也可以用newid()。不过空间占用大多了。
-bdbs(不多不少);
2006-12-6
(#3362205@0)
-
sorry,没想到怎么弄个sequence还需要说,这也成关键问题了
-maplew2008(call me at 911);
2006-12-6
(#3362222@0)
-
In Oracle, sequence is the right solution for this scenario.
-zdq(zdq);
2006-12-6
(#3362232@0)
-
LOL: you are talking about MS SQL Server, maplew2008 is saying Oracle.
-zdq(zdq);
2006-12-6
(#3362249@0)
-
Oracle: seq.nextval before you insert
SQL Server: SCOPE_IDENTITY() after you insert
-zdq(zdq);
2006-12-6
(#3361641@0)
-
good,这种方法很实用
-jimi.cui(jimi);
2006-12-6
(#3361997@0)
-
@@IDENTITY
-coolmao(酷猫);
2006-12-6
(#3361649@0)
-
IDENTITY_VAL_LOCAL() for DB2, @@IDENTITY for SQLServer
-looi500(looi);
2006-12-6
(#3361740@0)
-
刚才用SQL Server上试了, @@IDENTITY可行。 Sample: INSERT INTO Table1(Name) VALUES ('Test') SELECT @@IDENTITY
谢谢大家
-xm1223(andy);
2006-12-6
(#3362114@0)
-
有用Trigger的情况下不要用@@IDENTITY, 用SCOPE_IDENTITY( ), 事实上SQLServer 有三个类似的东西:@@IDENTITY,SCOPE_IDENTITY(), 和IDENT_CURRENT(),用法不完全相同,具体看手册。
-canadiantire(轮胎-pax et lux);
2006-12-6
(#3362165@0)
-
If you don't have concurrent queries, it's fine. Otherwise, Dangous!
-holx(Dicom);
2006-12-7
(#3363567@0)
-
ORACLE没有这种自增列(如果用触发器实现,那又得锁表,是不推荐的做法)。因此这个问题对ORACLE没有意义。
-newkid(newkid);
2006-12-6
(#3361743@0)
-
显然Oracle有,Sequence就是做这项工作的, seq.currentval 就是当前值,seq.nexval是下一个值
-rabbitbug(兔八哥);
2006-12-8
(#3365572@0)
-
SQL SERVER中可用自己增加的identity, 插入之后 @@identity中包含着刚插入的ID, Oracle要用transaction, 找出max(id), 然后插入 -- SQL Server中当然也可以这么做.
-poohbear(毛毛熊);
2006-12-6
(#3362553@0)
-
insert into table1
select @@identity
Please read a lot on T/SQL.
-kooncan(kooncan);
2006-12-6
(#3362658@0)
-
楼主在问Oracle和MS SQL中都能用的语句,@@IDENTITY是用在MS SQL里的,cur_value是Oracle里的。都能用的答案呢?每次这种讨论SQL语句的话题最后都成了那个厂商提供的可用函数多,哪位老大知道的函数多。。。唉。。。
-hard20(hard20);
2006-12-6
{95}
(#3362969@0)
-
It is logically impossible to use pure SQL for all DBMS, and without locking the table.LZ just want to get the idendity of the row just inserted. Yes, this is a common requirement in T-SQL, since you don't know the value before you insert. But in Oracle, it won't be a problem due to the sequence.
-zdq(zdq);
2006-12-7
{214}
(#3363258@0)
-
放心用@@IDENTITY,出了问题那还叫数据库? -担心是多余。纯SQL语句的想法最终会诞生一种新的sql, 就象PL/SQL, TSQL一样
-elecskunk(elecskunk);
2006-12-7
(#3365080@0)
-
依愚之见,ID的特点是unique,所以偶一般用 32 位的UUID。你不需要 care Table有啥。
-wukongjj(不经历风雨怎么见彩虹);
2006-12-7
(#3365167@0)
-
看不懂... 偶认为unique只是一个方面, 还要reference 方便, 想不出来不要ID怎么做foreign key...
-poohbear(毛毛熊);
2006-12-7
(#3365419@0)