2014-06-09 2 views
0

준비된 문을 사용하여 일부 값을 내 테이블에 저장해야합니다.자동 증분을 사용하여 데이터베이스에 삽입

내 테이블에 ID라는 열이 있으며 자동 증가로 설정됩니다. 이 열에 대해서는 사용자가 입력 할 필요가 없습니다.

다른 값은 모두 사용자가 가져옵니다.

편집 : 2 개의 ID가 있습니다. 하나는 사용자로부터, 다른 하나는 데이터베이스에서 자동으로 생성됩니다. 데이터베이스에 의해 자동으로 생성 된 것이 기본 키입니다.

내가이 일을 제대로하고 있습니까?

감사합니다.

준비 진술 :

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_details`(IN id varchar(45),IN username varchar(45),IN name varchar(45)) 

BEGIN insert into details (id,username,name) values (id ,username,name); 

END 

코드 : MySQL은 당신을 위해이 값을 설정합니다과 같이 간단하게 준비된 문에서 자동으로 생성 된 필드를 생략 할 수 있습니다

PreparedStatement preparedStatement = connect.prepareStatement("CALL INSERT_DETAILS(?,?,?)"); 
preparedStatement.setLong(1, userID); 
preparedStatement.setString(2, username); 
preparedStatement.setString(3, name); 

preparedStatement .executeUpdate(); 
+0

여기에 저장 프로 시저를 사용해야하는 이유가 있습니까? 당신은 단순히'connect.prepareStatement ("INSERT INTO details (id, username, name) VALUES (?,?,?)"); –

+0

예, 저장 프로 시저가 더 안전하지는 않습니까? – user3702643

+0

아닙니다. 이 경우 준비된 문을 사용하여 입력 데이터를 삭제하고 주입 공격을 방지하여 보안을 제공합니다. 저장 프로시 저는 일반적으로 여러 클라이언트가 사용할 수있는 논리를 통합하기 위해 예약되어 있습니다. –

답변

0

. 예제에서 매개 변수 이름은 테이블 속성 이름과 충돌합니다. 따라야 할 규칙은 매개 변수 이름에 p_ 또는 유사한 이름으로 맨 글을 붙이는 것입니다.

준비된 문은 더 다음과 같이한다 :

DELIMITER $$ 
CREATE 
    DEFINER=`root`@`localhost` 
PROCEDURE `insert_details`(
    IN p_user_id VARCHAR(45), 
    IN p_username VARCHAR(45), 
    IN p_name VARCHAR(45)) 
BEGIN 
    INSERT 
    INTO details(id, username, name) 
    VALUES (p_user_id, p_username, p_name); 
END $$ 
+0

죄송합니다. 언급하는 것을 잊어 버렸습니다. ID가 2 개 있습니다. 하나는 사용자의 것이고 다른 하나는 데이터베이스의 것입니다. 데이터베이스에 의해 자동으로 생성 된 것이 기본 키입니다. – user3702643

0

이 준비된 명령문에서 id 필드를 제거합니다.

필드 데이터가 충돌하므로 문제가 발생할 수 있습니다.

+0

죄송합니다. 언급하는 것을 잊어 버렸습니다. ID가 2 개 있습니다. 하나는 사용자의 것이고 다른 하나는 데이터베이스의 것입니다. 데이터베이스에 의해 자동으로 생성 된 것이 기본 키입니다. – user3702643

관련 문제