2016-05-31 21 views
1

最後に挿入されたレコードに基づいて列の主キー値を取得したいと思います。ストアドプロシージャmysqlで最後に挿入されたレコードの主キー列の値を取得

create table test 
(
id varchar(100) not null primary key, 
rmain varchar(100), 
rpart bigint 
); 

Delimiter $$ 

    DROP PROCEDURE IF EXISTS insTest$$ 
    Create Procedure insTest() 
    Begin 
    Set @rmain := (select trim(concat('DNB', DATE_FORMAT(CURRENT_DATE(), '%y'), DATE_FORMAT(CURRENT_DATE(), '%m')))); 

     IF ((trim(DATE_FORMAT(CURRENT_DATE(),'%m')) = 01) OR (trim(DATE_FORMAT(CURRENT_DATE(),'%m')) = 1)) THEN 
      Set @rpart = 1; 
     END IF; 

     IF ((trim(DATE_FORMAT(CURRENT_DATE(),'%m')) != 01) OR (trim(DATE_FORMAT(CURRENT_DATE(),'%m')) != 1)) THEN 
      Set @rpart := (select coalesce(max(rpart),0) from test) + 1; 
     END IF; 

     insert into Test (ID, rmain, rpart) values (concat(@rmain,@rpart),@rmain,@rpart); 
    End$$ 
    DELIMITER ; 

してくださいアドバイス下のテーブル構造です。私はlast_insert_ID()をチェックしましたが、auto_increment設定のプライマリキー列に対してのみ動作します。事前に感謝...

+0

タグをあなたの質問にアクセスすることができますこの方法でトランザクション分離レベルを設定します。 'mysql'と' tsql'は同じではありません。 – Rahul

答えて

2

なぜですか? select max(id)を取得した場合、またはselect id from tbl1 order by id desc limit 1を取得した場合はどうなりますか?

Transaction In MySQLを参照してください。また、READ COMMITTED

declare last_id INT; 
START TRANSACTION; 
INSERT INTO tbl1(id,col1,col2) values(1001,'test','test'); 
SELECT last_id = id FROM tbl1 ORDER BY id DESC LIMIT 1 
COMMIT; 
+0

同時挿入中にこれが機能すると思いますか?私はストアドプロシージャによって挿入されたIDをキャプチャしたい – Rajiv

+0

はい...確かに;なぜそれらを明示的なトランザクションブロックに囲まないのですか? – Rahul

+0

どうすればいいですか?アドバイスをお願いします。サンプルコードが本当に助けてくれるでしょう – Rajiv

0
INSERT INTO test (a,b,c) values (1,2,3); 
SELECT LAST_INSERT_ID(); 

にあなたが適切に最後に挿入ID

+0

複数のステートメントを(異なるテーブルで)実行すると、常に最後のステートメントのIDが返されます。 – user489872

関連する問題