2010-01-09 7 views
1

두 개의 다른 테이블에 대해 두 개의 삽입 문이있는 단일 프로 시저가 있습니다. table2에 삽입하기 전에 table1에 데이터를 삽입해야합니다. PHP를 사용하여 데이터 수집을하고 있습니다. 내가 알고 싶은 것은 table1과 관련된 많은 행을 가질 수있는 table2에 여러 행을 삽입하는 방법입니다. 어떻게하면 좋을까요?프로 시저를 사용하여 mysql 데이터베이스에 데이터를 어떻게 삽입합니까?

table1에 사람을 한 번만 저장하고 싶지만 table2에는 여러 행이 필요합니다. 이러한 삽입 문을 별도의 절차에 있었다면 문제가 없지만 두 번째 중복 레코드를 거부하는 table1없이 table2에 둘 이상의 행을 삽입하는 방법을 알지 못합니다.

BEGIN 

INSERT INTO user(name, address, city) VALUES(Name, Address, City); 

INSERT INTO order(order_id, desc) VALUES(OrderNo, Description); 

END 

답변

0

별도로 제안하는 것이 좋습니다. 그렇지 않으면 뭔가 변경되면 오류가 발생하는 복잡한 솔루션이 필요합니다.

복잡한 솔루션이다

  • 는 세퍼레이터 모든 orderno 및 설명 가입. (주문 번호 # 설명)
  • 다른 구분 기호로 모든 주문에 가입하십시오. (orderno # 설명/orderno # 설명/...) 절차의 절차
  • -
  • 패스가 주문 분리기, 그 각 순서
  • 각각 관통 한 후 반복해서 스트링을 분할하게 분할 첫 번째 구분 기호로 문자열을 입력 한 다음 해당 열에 삽입하십시오.

이 방법은 좋지 않습니다.

+0

Hi Tor. 예, 이것은 나쁩니다. 나는 다른 사람에게 이것이 매우 간단하고이 절차에 대한 단일 호출을해야한다고 말했지만 나는 이것이 가능한지 어떻게 보이지 않는다. 먼저 확인하고 싶었어. – B52s

+0

동의해야합니다. ** ** ** 나쁜 것입니다. – shylent

+0

@ B52s - 먼저 프로 시저에 목록을 전달하지 않고 프로 시저에 전달할 수 없으므로이 프로 시저를 통해 여러 행을 삽입하는 유일한 방법입니다. –

0

죄송 합니다만, 별도의 쿼리로 이러한 (관련없는 것처럼 보이는) 테이블에 데이터를 삽입하는 것을 어떻게 막을 수 있습니까? 중간에 실패한 아이디어가 마음에 들지 않는다면,이를 트랜잭션으로 래핑 할 수 있습니다. 나도 알아, mysqlipdo 잘 할 수 있습니다.

insertignore 모드에서는 경고에 삽입하는 동안 오류가 발생하므로 중복 행을 삽입하면 경고가 발행되고 행이 삽입되지 않지만 오류는 발생하지 않습니다.

+0

안녕하세요.도와 주셔서 감사합니다. "겉보기에는 무관"하지만 실제로는 관련이 있습니다. 적어도 둘 사이의 공통 키를 보여줘야했기 때문에 좋지 않았습니다. 나는 mysqli를 사용하고 있으며 확실히 트랜잭션을 사용할 수 있습니다. 나는 이미 t1에 단일 레코드를 입력하고 t2에 3 개의 레코드를 입력하려고했지만 t2는 하나만 가져 왔습니다. 나는 그 거래가 되돌아 왔다고 믿는다. 그렇다면 IGNORE를 사용하면 table2에 3 개의 행을 모두 넣을 수 있습니까? – B52s

+0

네, "겉으로보기에"라고 말했습니다. 왜냐하면 코드가 아무런 의미가 없기 때문입니다. 어쨌든 "어쨌든"t2가 "하나만 가져 갔다"는 것은 무엇을 의미합니까? 당신은'commit()'을 호출하기 전에 * 4 * insert를 발행했고 그것은 단지 두 개만을 삽입했다 (t1에 하나, t2에 하나)? – shylent

0

첫 번째 문에는 IGNORE 키워드를 사용할 수 있습니다.
http://dev.mysql.com/doc/refman/5.1/en/insert.html :

IGNORE 키워드를 사용하면 INSERT 문을 실행하는 동안 발생하는 오류는 대신 경고로 처리됩니다. 예를 들어 IGNORE가 없으면 테이블의 기존 UNIQUE 인덱스 또는 PRIMARY KEY 값을 복제하는 행에서 중복 키 오류가 발생하고 명령문이 중단됩니다. IGNORE를 사용하면 여전히 행이 삽입되지 않지만 오류는 발생하지 않습니다.
그러나 어떻게 든 이것은 나에게 다소 비효율적 인 것처럼 보입니다. "눈의 가슴을 통해 뒤에서 찔 리다"- 해결책.

+0

롤 ... 나는 동의한다. 나는 그런 것을 상상 한 적이 없지만 당신이 옳다. :) 그럼 삽입 문을 분리해야합니까? 이것이 올바른 방법일까요? – B52s

관련 문제