我在表格中插入了一些值.有一列其值是自动生成的.在我的代码的下一个语句中,我想要检索此值.
你能告诉我怎么做正确的方法吗?
@@IDENTITY
不是范围安全的,如果在原始表上有插入触发器,则会从另一个表中返回id,始终使用 SCOPE_IDENTITY()
这就是我使用自动生成的ID为MSSQL执行存储过程的方法.
CREATE PROCEDURE [dbo].[InsertProducts] @id INT = NULL OUT, @name VARCHAR(150) = NULL, @desc VARCHAR(250) = NULL AS INSERT INTO dbo.Products (Name, Description) VALUES (@name, @desc) SET @id = SCOPE_IDENTITY();
如果您使用PHP和MySQL,则可以使用mysql_insert_id()函数,该函数将告诉您刚刚输入的项目的ID.
但是没有你的语言和DBMS,我只是在黑暗中拍摄.
这在SQL 2005中运行得非常好:
DECLARE @inserted_ids TABLE ([id] INT); INSERT INTO [dbo].[some_table] ([col1],[col2],[col3],[col4],[col5],[col6]) OUTPUT INSERTED.[id] INTO @inserted_ids VALUES (@col1,@col2,@col3,@col4,@col5,@col6)
如果您的INSERT语句插入多行,它的好处是返回所有ID.
同样没有语言不可知的响应,但在Java中它是这样的:
Connection conn = Database.getCurrent().getConnection(); PreparedStatement ps = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS); try { ps.executeUpdate(); ResultSet rs = ps.getGeneratedKeys(); rs.next(); long primaryKey = rs.getLong(1); } finally { ps.close(); }
如果您正在使用Oracle:
插入表(字段....)值(值...)RETURNING(字段列表...)INTO(变量...)
例:
插入人(名称)值('杰克')将ID_PERSON归入vIdPerson
或者如果你正在调用...带有CallableStatement的Java(sry,这是我的字段)
插入人(姓名)值('杰克')返回ID_PERSON INTO?
并声明该语句的autput参数
没有标准的方法(就像没有标准方法来创建自动递增ID一样).以下是在PostgreSQL中执行此操作的两种方法.假设这是你的表:
CREATE TABLE mytable ( id SERIAL PRIMARY KEY, lastname VARCHAR NOT NULL, firstname VARCHAR );
你可以在两个语句中完成它,只要它们是同一连接中的连续语句(这在PHP中是安全的连接池,因为PHP在脚本完成之前不会将连接返回池):
INSERT INTO mytable (lastname, firstname) VALUES ('Washington', 'George'); SELECT lastval();
lastval()为您提供当前连接中使用的最后一个自动生成的序列值.
另一种方法是在INSERT语句中使用PostgreSQL的RETURNING子句:
INSERT INTO mytable (lastname) VALUES ('Cher') RETURNING id;
此表单返回结果集,就像SELECT语句一样,并且还可以方便地返回任何类型的计算默认值.