2009-05-16 5 views
3

행의 자동 ID (다른 것들)를 기반으로 해시에 대한 char 열이있는 행을 삽입하고 있습니다.MySQL current_insert_id()? (not last_insert_id())

삽입 할 수 있고, insert_id를 가져오고, 해시를 계산하고, 업데이트 할 수 있다는 것을 알고 있습니다.

누구나 단일 쿼리에서이 작업을 수행 할 수있는 방법을 알고 있습니까? 삽입 할 때 insert_id 행이 필요합니다. 그게 완전히 불가능하거나, current_insert_id()와 같은 것이 있습니다 ...

고마워요!

+0

궁금한데 왜 행 키에서 생성 된 해시가있는 열이 필요합니까? – duckyflip

+0

이 경우 실제로는 해시는 아니지만 36 번 행 키로 구성된 반 판독 가능 공개 키가 다른 것들에 추가됩니다. 그것은 id와 행에 고유 한 키가 필요한 양식 및 기타 장소에서 공개 키로 사용되지만 실제 행 ID를 노출하거나 예측 가능한 패턴을 표시하지 않으려합니다. – Eli

답변

11

아니요, MySQL에는 아무런 기능이 없으므로 current_insert_id()이 있습니다.

MySQL의 AUTO_INCREMENT 필드에서 생성 된 ID 값을 얻는 유일한 방법은 INSERT를 수행 한 다음 last_insert_id()을 호출하는 것입니다. 해시를 계산하기위한 별도의 UPDATE 계획은 아마해야 할 일입니다.

나는 두 개의 다른 대안을 생각할 수 있습니다

  • AUTO_INCREMENT 이외의 다른 메커니즘에 삽입하기 전에 고유 한 값을 직접 생성 할 수 있습니다. 예를 들어 UUID() 함수를 참조하십시오.

    SET @id = SELECT UUID(); 
    INSERT INTO MyTable (id, hash) VALUES (@id, hash(@id...)); 
    
  • 해시 계산에 ID를 포함하지 마십시오.

2

내가 한 쿼리에서 MySQL의에서 작업을 수행하는 알고있는 방법은 없습니다,하지만 당신은 선택의 서버 측 스크립트 언어로 같은 것을 할 수 있습니다 :

<?php 

$query = mysql_query("SHOW TABLE STATUS LIKE 'MyTable'"); 
$row = mysql_fetch_assoc($query); 
$next_id = $row['Auto_increment']; 

?> 

... 이것은 당신의 SQL에 통합 할 id를 제공한다.

편집 : this answer도 도움이 될 것으로 나타났습니다.

INSERT INTO table (col1,col2) VALUES (data1,data2);SELECT LAST_INSERT_ID()

을 내가 데이터를 가져 오는 것처럼 단지 쿼리를 실행 :

+1

이것은 경쟁 조건에 영향을 받기 쉽습니다. –

0

내가 삽입을 할 때 나는 같은 것을 할. VB.NET에서는 구문 (당신이 MySql.Data.MySqlClient의 .DLL이 가정)된다

Dim sql As String = "[sql string above]" 
Dim dr As MySqlDataReader = YourRetrieveDataFunction(sql) 

dr.Read() 
yourObjectInstance.ID = dr(0) 
dr.Close 

그것은 기술적으로 두 개의 질의되지만 데이터베이스 :

+0

Eli는 삽입 된 ID가 아닌 * about * 인 id를 원합니다. – da5id

+0

흠 ... SELECT 무엇이든, (SELECT id + 1 FROM 테이블 ORDER BY id DESC LIMIT 1) newid ....? 이게 실제로 작동하는 지 모르겠다. – Jason

+0

괜찮아. 그냥 시도 했어. 구조 대원 쿼리! – Jason

1

당신은을 조회 할 수 있습니다에 단 하나의 히트입니다 information_schema에서 사용할 다음 값. TABLES 테이블에는 AUTO_INCREMENT 열이 있습니다. (당신은 경쟁 조건에 대해 스스로를 설정하고있을 것입니다.)

+1

예, 이것은 경쟁 조건의 영향을 받기 쉽습니다. –