SQL*_*ace 56
@@IDENTITY 不是范围安全的,如果在原始表上有插入触发器,则会从另一个表中返回id,始终使用 SCOPE_IDENTITY()
Dav*_*rab 29
这就是我使用自动生成的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();
Run Code Online (Sandbox Code Playgroud)
Dan*_*fer 14
这在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)
Run Code Online (Sandbox Code Playgroud)
如果您的INSERT语句插入多行,它的好处是返回所有ID.
Sla*_*ast 11
同样没有语言不可知的响应,但在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();
}
Run Code Online (Sandbox Code Playgroud)
如果您正在使用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
);
Run Code Online (Sandbox Code Playgroud)
你可以在两个语句中完成它,只要它们是同一连接中的连续语句(这在PHP中是安全的连接池,因为PHP在脚本完成之前不会将连接返回池):
INSERT INTO mytable (lastname, firstname) VALUES ('Washington', 'George');
SELECT lastval();
Run Code Online (Sandbox Code Playgroud)
lastval()为您提供当前连接中使用的最后一个自动生成的序列值.
另一种方法是在INSERT语句中使用PostgreSQL的RETURNING子句:
INSERT INTO mytable (lastname) VALUES ('Cher') RETURNING id;
Run Code Online (Sandbox Code Playgroud)
此表单返回结果集,就像SELECT语句一样,并且还可以方便地返回任何类型的计算默认值.
| 归档时间: |
|
| 查看次数: |
105830 次 |
| 最近记录: |