2011-02-01 5 views
3

I가 내가 기본적으로 두 테이블로 분할 할 2 열이 하나 개의 테이블 : COL2 USER_ID, COL1,mysql : "INSERT INTO"2 테이블을 수행하는 방법이 있습니까?

새로운 테이블 :

테이블 A 열

B : USER_ID, COL1

C :

INSERT INTO B (user_id, col1) SELECT user_id,col1 from A; 
INSERT INTO C (user_id,col2) SELECT user_id, col2 from A; 
0 :

USER_ID, COL2는 내가하고 싶은

하지만 한 문장으로하고 싶습니다. 테이블이 크다. 그래서 나는 단지 한 번에 그것을하고 싶어한다. 이것을 할 수있는 방법이 있습니까?

Thx.

+0

이론적으로 B와 C를 합친 다음 V를 삽입하면 Codd의 12 개 규칙 중 규칙 6이 적용됩니다. "보기 업데이트 규칙 : 이론적으로 업데이트 할 수있는 모든보기는 시스템에서 업데이트 할 수 있어야합니다." http://en.wikipedia.org/wiki/Codd's_12_rules). 표준 해결 방법은'INSTEAD OF' 트리거이지만 MySQL이 VIEW에서 트리거를 지원하지 않는 것 같습니다. – onedaywhen

+0

... 보충 삽입 문을 배치 할 B 또는 C 중 하나에 삽입 할 트리거를 만들 수 있습니다. –

답변

1

아니요. 둘 이상의 표에 동시에 삽입 할 수 없습니다. INSERT 구문은 단일 테이블 이름 만 허용합니다.

http://dev.mysql.com/doc/refman/5.5/en/insert.html

INSERT [LOW_PRIORITY | 지연 | 는 HIGH_PRIORITY] [IGNORE] [INTO] tbl_name를 [...

+0

Jack이 하위 쿼리를 사용하는 경우 하나의 명령문으로 간주되지 않습니까? – fncomp

+0

@Josh : 여전히 두 개 (또는 그 이상)의 테이블에 삽입 할 수 없습니다. – Mchl

1

두 삽입을 캡슐화하고 트랜잭션을 보호하기 위해 저장 프로 시저를 작성합니다.

1

에 의해, 당신은 "원자"의미 "한 성명에서"경우 - 하나 개의 테이블에 삽입하지만, 다른 사용자들은 결코 일어날 수 있도록 - 다음 거래는 당신이 찾고있는 무엇 :

START TRANSACTION; 
INSERT INTO B (user_id, col1) SELECT user_id,col1 from A; 
INSERT INTO C (user_id,col2) SELECT user_id, col2 from A; 
COMMIT; 

실제로 이것을 단일 명령문에서 수행해야하는 경우, 이것을 저장 프로 시저로 작성하여 호출 할 수 있습니다 (@lexu 제안).

은 참조 설명서를 참조하십시오 : http://dev.mysql.com/doc/refman/5.0/en/commit.html

주의해야 :이 MyISAM 테이블 (NO 트랜잭션 지원) 작동하지 않습니다, 그들은 이노해야합니다.

+0

아마 내가 사용하지만 한 세미콜론에 포함 된 내용을 표현식처럼 생각하는 것이 더 좋은 정의입니까? – fncomp

+1

@ Josh : 당신은 꽤 정확합니다 - 첫 번째 문장에서 내 설명을보십시오. 내 경험상 많은 사람들은 트랜잭션을 인식하지 못하기 때문에 "한 문장으로"말하면 "원자 적으로 발생합니다"를 의미합니다. 실제로 OP가 "단일 성명서로 작성되어야 함"을 의미한다면, 나의 대답은 적용될 수 없습니다. (나는 OP *가 그것을 썼음을 알고 있지만, 사람들은 여기에 사람들이 종종 관련 어휘를 배우기 때문에 그들이 쓰는 것보다 다른 것들을 종종 의미한다.) – Piskvor

+0

예, 나는 "하나의 진술"을 의미 했지 "원자 적으로". 그 의도는 성과입니다. 나는이 테이블을 통과하여 전체 행을 선택한 다음 2 개의 새로운 테이블에 삽입하는 것이 2 stmts를 순차적으로 실행하는 것보다 빠르다는 것을 추측하고있다. – Jack

0

테이블이 여러 물리적 디스크에 분산되어 있지 않으면 선택/삽입 속도가 IO 경계가 될 수 있습니다.

한 번에 두 테이블에 삽입하려고하면 (디스크가 가능할지라도) 디스크가 테이블에 더 많은 쓰루를해야하므로 총 삽입 시간이 길어질 수 있습니다.

관련 문제