2011-08-09 5 views
0

여러 필드가 포함 된 테이블이 있습니다. 기본 키는 userId입니다.SQL 쿼리에서 행을 복제합니다.

:

+------+ 
|userId| 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
...etc 

내가 지금, A, B, C로 끝나는 새로운 행을 추가과 같이 할 : 현재 user id 열은 값 '1,2,3,4 ... 등'과 같이 포함

+------+ 
|userId| 
+------+ 
| 1 | 
| 1a | 
| 1b | 
| 1c | 
| 2 | 
| 2a | 
| 2b | 
| 2c | 
...etc 

새 행은 userId를 제외하고는 부모 행과 동일해야합니다. 즉, 1a, 1b & 1c가 1과 일치해야합니다.

또한 '사용자'열에 'a', 'b'또는 'c'가 몇 개 존재하지 않을 것이라고 보장 할 수 없습니다.

이 작업을 빠르고 쉽게 수행 할 수있는 SQL 쿼리를 작성하는 방법이 있습니까?

+1

이 작업을 수행하는 것이 매우 바람직합니다. – Jacob

+0

삽입 쿼리가 필요합니까? 데이터베이스 버전은 mysql 4, 5, 6입니까? 데이터베이스 종속 함수 또는 sql99 호환 가능 항목 만 사용할 수 있습니까? 그것은 1 개의 쿼리 여야 하는가 아니면 더 많은 쿼리 일 수 있는가? – Ali

+0

@ 그것은 MySQL 5.1입니다. 둘 이상의 쿼리 일 수 있습니다. – Urbycoz

답변

3

당신이 해결하려고하는 것보다 더 많은 문제를 겪게 될 것입니다!

편지를 저장할 새 열을 추가하고 기본 UserId와이 새 열을 기본 키로 사용하십시오.

userId 만 사용하려는 경우 글자 부분을 분리해야합니다. 그러면 검색어에 비용이 많이 들고 실제 고통이 될 수 있습니다.

1

나는 KM에 동의한다. 왜 이러한 중복/복합 ID를 만드는 지 잘 모르겠지만 취할 수있는 불편한 방향으로 느껴집니다.

즉, 극복해야 할 한 가지 장애물이 있습니다. 분명히 MySQL에서 동일한 테이블을 선택하거나 삽입 할 수는 없습니다.

그래서, 당신은 당신의 환경에 따라 ...

CREATE Temporary TABLE MyNewUserIDs (
    UserID VARCHAR(32) 
) 

INSERT INTO 
    myNewUserIDs 
SELECT 
    CONCAT(myTable.UserID, suffix.val) 
FROM 
    myTable 
INNER JOIN 
    (SELECT 'A' as val UNION ALL SELECT 'B' UNION ALL SELECT 'C' UNION ALL SELECT 'D') AS suffix 
    ON RIGHT(myTable.UserID, 1) <> Suffix.val 
WHERE 
    NOT EXISTS (SELECT * FROM myTable AS lookup WHERE UserID = CONCAT(myTable.UserID, suffix.val)) 

INSERT INTO 
    myTable 
SELECT 
    UserID 
FROM 
    MyNewUserIDs 

을 한 후, 먼저 임시 테이블에 삽입 실제 테이블에 삽입해야합니다, 당신은 테이블을 잠금으로보고 할 수 있도록 변경 ID 목록을 작성하여 테이블에 삽입하는 것 사이에 이루어지지 않습니다.

0

이것은 여분의 행을 생성하는 SQL의 관점에서 매우 간단합니다 : 당신이 내가 여기에 가정 한이 개 고유 한 값으로 저장하는 방법을 알려줍니다 여기

km의 대답 @ 그렇게 할 것입니다. 원하는 경우 사용자 ID와 접미사를 자유롭게 연결할 수 있습니다.

INSERT myTable (userid, suffix, co11, col2, ...coln) 
SELECT M.userid, X.suffix, M.col1, M.col2, ..., M.coln 
FROM 
    myTable M 
    CROSS JOIN 
    (SELECT 'a' AS Suffix UNION ALL SELECT 'b' UNION ALL SELECT 'c') X 
WHERE 
    NOT EXISTS (SELECT * 
      FROM 
      MyTable M2 
      WHERE 
      M2.userid = M.userid ANS M2.Suffix = X.Suffix) 
+0

이것이 MySQL이고 INSERT와 SELECT 모두에서 myTable을 참조 할 수 없다는 사실을 제외하고는? – MatBailie

+1

@Dems : 그 사실을 몰랐습니다. 그래서 원시적 인 ... – gbn

+0

흠, SQL Snobbery? ;) – MatBailie

관련 문제