2012-04-06 4 views
1

4 개의 테이블에 값을 삽입하는 저장 프로 시저를 만듭니다. SQL 삽입을 막고 사용자가 가진 권한을 더 잘 정의하도록 PHP를 벗어나는 것이 요점입니다. 즉, INSERT, SELECT, ALTERDELETE 문에 대한 무제한 액세스가 허용되지 않고 단순히 프로 시저를 실행할 수 있습니다 전달 된 변수를 삽입해야합니다.MySQL 조건부 INSERT (매개 변수 포함)

그러나 플레이어가 이미있는 경우 다시 추가 할 필요가 없습니다 (고유 한 것으로 생각하면 불가능합니다). 이 문제는 플레이어 테이블과 좌표 테이블간에 일대일 관계가 있기 때문에 발생합니다.

그렇다면 값이 이미 존재하는지 테스트하고 다음 INSERT 문으로 이동하려면 조건부 INSERT을 테스트하고 싶습니다.

다음은 저장 프로 시저의 :

CREATE PROCEDURE `acdb_extended`.`addAlliedMember` (IN accountNumber VARCHAR(255), 
    IN userName VARCHAR(255), IN serverInitial CHAR(1), IN galaxy TINYINT(2), 
    IN region TINYINT(2), IN system TINYINT(2), IN astro TINYINT(2), IN level TINYINT(2), 
    IN allianceName VARCHAR(255)) 
BEGIN 
    INSERT INTO player (account_number, username) 
    VALUES (accountNumber, userName); 

    INSERT INTO coordinates (player_ID, server_initial, galaxy, region, system, astro) 
    VALUES ((SELECT player_ID FROM player WHERE username = userName), serverInitial, 
     galaxy, region, system, astro); 

    INSERT INTO jumpgate (player_ID, coordinates_ID, level, usable) 
    VALUES ((SELECT player_ID FROM player WHERE username = userName), 
     (SELECT c.coordinates_ID FROM coordinates c WHERE c.server_initial = serverInitial 
      AND c.galaxy = galaxy AND c.region = region AND c.system = system AND c.astro = astro), 
     level, FALSE); 

    INSERT INTO relationship (player_ID, ally, alliance_name) 
    VALUES ((SELECT player_ID FROM player WHERE username = userName), 
     TRUE, allianceName); 
END 

내가 생각하는 나는 ON DUPLICATE KEY 필요하지만 확실히 그것의 사용을 알아낼 수 없습니다. 모든 도움에 미리

감사합니다.

답변

1

는 MySQL을 사용하여이 작업을 수행하는 방법은 여러 가지가 있습니다. 간단한 해결책은 INSERT 대신 INSERT IGNORE을 사용하는 것입니다. 새로운 행이 기존 UNIQUE INDEX 또는 PRIMARY KEY 값을 테이블에 복제하면 전자는 기본적으로 아무 것도 수행하지 않습니다. 자세한 내용은 INSERT Syntax에 대한 MySQL 설명서를 참조하십시오.

더 많은 유연성을 제공하는 INSERT INTO ... SELECT ... 구문을 사용할 수도 있습니다. 간단한 예를 들어 봅시다. 당신이는 foobar에서 중복 항목을 감지하는 SELECT 쿼리를 변경하는 경우

INSERT INTO foobar (foobar_id,display_name) VALUES (1,'one'); 

INSERT INTO foobar (foobar_id,display_name) 
    SELECT 1,'one' FROM dual; 

, 당신은 원하는 동작을 얻을 : 다음 명령문은 기본적으로 같은 일을. 자세한 내용은 INSERT ... SELECT Syntax에 대한 MySQL 설명서를 참조하십시오.

편집 : 이것은 저장 프로 시저 내부와 저장 프로 시저의 매개 변수 작품 : 삽입 할 값이 매개 변수는 경우

CREATE PROCEDURE sp_foobar(IN _foobar_id int, IN _display_name varchar(255)) 
BEGIN 
    INSERT INTO foobar (foobar_id, display_name) 
     SELECT _foobar_id, _display_name 
     FROM dual; 
END; 
+0

당신이'INSERT ... SELECT'를 사용할 수 있습니까? 당신이 그 예를 보여줄 수 있습니까? – Arcadian

+0

듀얼은 무엇을 의미합니까? 테이블 이름인가요? 아니면 매개 변수에 대한 이중 참조입니까? 나는'SELECT'을 이해하지만, 나는 이것을 'FROM'을 가리키는 곳으로 이해하지 못합니다. – Arcadian

+0

http://en.wikipedia.org/wiki/DUAL_table – nosid

0

당신이 아마 같은 그것을 할 수 없습니다 :

IF NOT EXISTS(SELECT NULL FROM player WHERE account_number=accountNumber AND username=userName) 
BEGIN 
    INSERT INTO player (account_number, username) 
    VALUES (accountNumber, userName); 

    INSERT INTO coordinates (player_ID, server_initial, galaxy, region, system, astro) 
    VALUES ((SELECT player_ID FROM player WHERE username = userName), serverInitial, 
     galaxy, region, system, astro); 
END