programing

SQL: 방금 삽입한 값의 ID를 가져오는 방법은 무엇입니까?

oldcodes 2023. 7. 8. 11:10
반응형

SQL: 방금 삽입한 값의 ID를 가져오는 방법은 무엇입니까?

표에 몇 가지 값을 삽입했습니다.값이 자동으로 생성되는 열이 있습니다.내 코드의 다음 문장에서 이 값을 검색하려고 합니다.

올바른 방법을 알려주시겠습니까?

@@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();

이는 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를 반환할 수 있습니다.

만약 당신이 PHP와 MySQL을 사용한다면, 당신은 방금 삽입한 항목의 ID를 알려주는 mysql_insert_id() 함수를 사용할 수 있습니다.
하지만 당신의 언어와 DBMS가 없다면 저는 여기서 그저 어둠 속에서 촬영하고 있을 뿐입니다.

언어에 구애받지 않는 응답은 없지만 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로 작업하는 경우:

표에 삽입(필드...) 값(값...) 반환(필드 목록...) 대상(변수...)

예:

사용자(이름)에 값 삽입('잭') ID_Person을 vidPerson에 반환

아니면 당신이 ...에서...호출 가능한 문이 있는 Java(죄송합니다. 제 분야입니다.)

ID_Person(이름) 값('잭')에 삽입 ID_Person을 반환하시겠습니까?

문에 대한 자동 입력 매개 변수 선언

자동 증분 ID를 만드는 표준 방법이 없는 것과 마찬가지로 표준 방법도 없습니다.Postgre에서 이를 수행하는 두 가지 방법이 있습니다.SQL. 테이블이 사용자의 테이블이라고 가정합니다.

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()는 현재 연결에 사용된 마지막 자동 생성 시퀀스 값을 제공합니다.

다른 방법은 Postgre를 사용하는 것입니다.INSERT 문에 있는 SQL의 RETURNING 절:

INSERT INTO mytable (lastname) VALUES ('Cher') RETURNING id;

양식은 SELECT 문과 마찬가지로 결과 집합을 반환하며 계산된 기본값을 반환하는 데도 유용합니다.

중요한 점은 공급업체 SQL 쿼리를 사용하여 마지막으로 삽입한 ID를 검색하면 동시 연결을 걱정하지 않고 안전하게 사용할 수 있습니다.

저는 항상 다른 고객이 삽입한 ID를 검색하지 않기 위해 라인을 삽입하고 마지막으로 삽입한 ID를 선택하기 위해 트랜잭션을 만들어야 한다고 생각했습니다.

그러나 이러한 공급업체별 쿼리는 항상 데이터베이스에 대한 현재 연결에 대해 마지막으로 삽입된 ID를 검색합니다.즉, 마지막으로 삽입한 ID는 자체 데이터베이스 연결을 사용하는 한 다른 클라이언트 삽입의 영향을 받을 수 없습니다.

SQL 2005의 경우:

다음 테이블 정의를 가정합니다.

CREATE TABLE [dbo].[Test](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [somevalue] [nchar](10) NULL,
) 

다음을 사용할 수 있습니다.

INSERT INTO Test(somevalue)
OUTPUT INSERTED.ID
VALUES('asdfasdf')

그러면 ID 열의 값이 반환됩니다.

저는 사이트에서 다음과 같은 것들을 알게 되었습니다.

SQL SERVER – @IDENTITY vs SCOPE_IDENTITY() vs IDENT_CURRENT – 2007년 3월 25일 마지막으로 삽입한 레코드의 ID 검색

SELECT @IDENTITY 값을 생성한 테이블 및 값을 생성한 문의 범위에 관계없이 연결에서 생성된 마지막 IDENTITY 값을 반환합니다.@@IDENTITY는 현재 세션의 테이블에 입력된 마지막 ID 값을 반환합니다.@@IDENTITY는 현재 세션으로 제한되지만 현재 범위로 제한되지는 않습니다.다른 테이블에서 ID를 생성하는 트리거가 테이블에 있는 경우 마지막으로 생성된 ID가 생성된 트리거인 경우에도 해당 ID를 얻을 수 있습니다.

SELECT SCOPE_IDENTITY() 값을 생성한 테이블에 관계없이 동일한 범위의 연결 및 문에서 생성된 마지막 IDENTITY 값을 반환합니다.SCOPE_IDENTITY()는 @@IDENTITY와 마찬가지로 현재 세션에서 생성된 마지막 ID 값을 반환하지만 현재 범위로도 제한됩니다.즉, 트리거 또는 사용자 정의 함수에 의해 생성된 ID가 아닌 사용자가 명시적으로 생성한 마지막 ID 값을 반환합니다.

IDENT_CURRENT('표 이름')를 선택합니다.값을 생성한 연결 및 값을 생성한 문의 범위에 관계없이 테이블에서 생성된 마지막 IDENTITY 값을 반환합니다.IDENT_CURRENT는 범위와 세션에 의해 제한되지 않으며 지정된 테이블로 제한됩니다.IDENT_CURRENT는 모든 세션 및 범위의 특정 테이블에 대해 생성된 ID 값을 반환합니다.

@@IDENTITY는 테이블에서 최근에 추가된 행의 ID가 아니라 현재 연결에 대해 가장 최근에 생성된 ID를 반환합니다.최근에 추가한 행의 ID를 반환하려면 항상 SCOPE_IDENITY()를 사용해야 합니다.

어떤 데이터베이스를 사용하고 있습니까?제가 알기로는 데이터베이스에 구애받지 않는 방법은 없습니다.

이렇게 매개 변수화된 명령을 사용하여 작업을 수행했습니다.

MSSQL

 INSERT INTO MyTable (Field1, Field2) VALUES (@Value1, @Value2); 
 SELECT SCOPE_IDENTITY(); 

MySQL

 INSERT INTO MyTable (Field1, Field2) VALUES (?Value1, ?Value2);
 SELECT LAST_INSERT_ID();
sql = "INSERT INTO MyTable (Name) VALUES (@Name);" +
      "SELECT CAST(scope_identity() AS int)";
SqlCommand cmd = new SqlCommand(sql, conn);
int newId = (int)cmd.ExecuteScalar();

Ms SQL Server: 행을 더 많이 삽입해도 좋은 솔루션입니다.

 Declare @tblInsertedId table (Id int not null)

 INSERT INTO Test ([Title], [Text])
 OUTPUT inserted.Id INTO @tblInsertedId (Id)
 SELECT [Title], [Text] FROM AnotherTable

 select Id from @tblInsertedId 

Rob의 답변은 공급업체에 구애받지 않는 답변이지만 MySQL을 사용하는 경우에는 보다 안전하고 정확한 선택이 기본 제공됩니다.LAST_INSERT_ID()기능.

SELECT @@Scope_Identity as Id

@@identity도 있지만 트리거가 있는 경우 트리거 중에 발생한 결과를 반환합니다. 여기서 scope_identity는 스코프와 일치합니다.

  1. 알려진 GUID가 있는 행을 삽입합니다.
  2. 이 GUID를 사용하여 autoId 필드를 가져옵니다.

이것은 모든 종류의 데이터베이스에서 작동해야 합니다.

환경 기반 오라클 솔루션:

CREATE OR REPLACE PACKAGE LAST
AS
ID NUMBER;
FUNCTION IDENT RETURN NUMBER;
END;
/

CREATE OR REPLACE PACKAGE BODY LAST
AS
FUNCTION IDENT RETURN NUMBER IS
    BEGIN
    RETURN ID;
    END;
END;
/


CREATE TABLE Test (
       TestID            INTEGER ,
    Field1      int,
    Field2      int
)


CREATE SEQUENCE Test_seq
/
CREATE OR REPLACE TRIGGER Test_itrig
BEFORE INSERT ON Test
FOR EACH ROW
DECLARE
seq_val number;
BEGIN
IF :new.TestID IS NULL THEN
    SELECT Test_seq.nextval INTO seq_val FROM DUAL;
    :new.TestID := seq_val;
    Last.ID := seq_val;
END IF;
END;
/

To get next identity value:
SELECT LAST.IDENT FROM DUAL

트랜잭션 중SQL, OUTPUT 절을 사용하면 됩니다.

INSERT INTO my_table(col1,col2,col3) OUTPUT INSERTED.id VALUES('col1Value','col2Value','col3Value')

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

가장 간단한 대답:

command.ExecuteScalar()

기본적으로 첫 번째 열을 반환합니다.

반환 값 유형: 시스템.Object 결과 집합에서 첫 번째 행의 첫 번째 열 또는 결과 집합이 비어 있는 경우 Null 참조(Visual Basic에서는 없음).최대 2033자를 반환합니다.

MSDN에서 복사됨

언급URL : https://stackoverflow.com/questions/45651/sql-how-to-get-the-id-of-values-i-just-inserted

반응형