2015-01-01 3 views
2

여기 (간체) 내 현재 주문 판매 테이블 구조입니다 :MySQL의 분할 단일 행 값

거래 :

id|order_id|total|created 

다음
id|order_id|fee1|fee2|fee3|fee4|fee5|fee6|fee7|fee8|total|created 

내가이되고 싶은거야

거래 _ 갑 :

id|transaction_id|fee|amount 

원래 주문 판매 기록을 가지고이 새로운 2 테이블 구조로 이동하는 방법은 무엇입니까?

나는 MySQL의 선택 ... 삽입을 알고, 이것은 내가 지금까지 무엇을 가지고 :

INSERT INTO transactions (order_id, total, created) 
     SELECT order_id, total, created 
     FROM order_sales 

을하지만 나는 또한 ... 수수료 (N)를 수수료 1 잡기 위해 필요로 사람들을 넣어 transaction_fee 테이블은 수수료 테이블과 동일한 쿼리에서 트랜잭션의 기본 키를 외래 키로 사용하므로 정확해야합니다.

는 그래서됩니다 :

Transactions 
1|123|50.00|2015-01-01 00:00:00 

Transaction_fee 
1|1|fee1|10.00 
1|1|fee2|10.00 
1|1|fee3|10.00 
1|1|fee4|10.00 
1|1|fee5|10.00 

어떤 생각?

+0

구조로 이것을 설명하는 것은 오히려 지나치게 관대 한 용어 사용입니다. 하지만 네가 어디로 향하는 지 알 겠어. – Strawberry

+0

현재 테이블의 'order_id'가 고유합니까? – sn00k4h

+0

@ sn00k4h 합리적인 가정이다. – Strawberry

답변

0

데이터베이스의 구조를 변경하면 많은 다른 변경 사항이 필요하다는 것을 알고 있습니다. 그러나 많은 경우에 많은 작업이 필요할 수 있습니다. 그러나 데이터베이스 구조를 변경하면 작업을 훨씬 더 확장하고 간단하게 만들 수 있습니다.

예를 들어 새로운 종류의 수수료를 추가하려면 새 열을 추가하고 기존의 많은 쿼리를 편집해야합니다. 따라서 세 테이블의 판매 테이블을 나누는 것이 좋습니다. 주문 (주문 ID, 총 , 날짜 생성) // 합계가 필요한지 여부를 쿼리를 통해 선택할 수 있는지 여부를 묻는 메시지를 표시합니다.

수수료 유형 (Fee_ID, Fee_Title) // 모든 수수료 유형 (수수료 1, 수수료 2, 등))는 여기에 레코드로 저장해야합니다.

OrderFees (OrderID, Fees_ID, Amount) // 여기 FeeTypes 테이블에서 "Amount"를 만들 수 없다면 매번 지불 된 금액이 추가된다고 가정합니다.

이제 거래를 보내려는 경우 거래 주문을 보내려면 각 주문에 대한 세부 정보를 보내려면 주문 서머리를 저장하고 싶다면 주문 테이블에 완전한 삽입 명세서가 될 수 있습니다. OrderID, FeeID 및 금액을 포함한 OrderFees 테이블.

+1

나는 그것이 OP가하려고하는 것이라고 생각한다. – Strawberry

1

은 'ORDER_ID'열이 고유 경우

DROP TABLE IF EXISTS transactions; 

CREATE TABLE transactions 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,order_id INT NOT NULL 
,fee1 DECIMAL(5,2) NOT NULL 
,fee2 DECIMAL(5,2) NOT NULL 
,fee3 DECIMAL(5,2) NOT NULL 
,total DECIMAL(5,2) NOT NULL 
,created DATETIME NOT NULL 
); 

INSERT INTO transactions VALUES 
(1,123,50.00,75.00,25.00,150.00,'2015-01-01 00:00:00'), 
(2,125,10.00,25.00,15.00,50.00,'2015-01-02 00:00:00'); 


SELECT * FROM transactions; 

+----+----------+-------+-------+-------+--------+---------------------+ 
| id | order_id | fee1 | fee2 | fee3 | total | created    | 
+----+----------+-------+-------+-------+--------+---------------------+ 
| 1 |  123 | 50.00 | 75.00 | 25.00 | 150.00 | 2015-01-01 00:00:00 | 
| 2 |  125 | 10.00 | 25.00 | 15.00 | 50.00 | 2015-01-02 00:00:00 | 
+----+----------+-------+-------+-------+--------+---------------------+ 

SELECT id 
    , order_id 
    , 1 fee_id 
    , fee1 value 
    , created 
    FROM transactions 
UNION 
SELECT id 
    , order_id 
    , 2 
    , fee1 
    , created 
    FROM transactions 
UNION 
SELECT id 
    , order_id 
    , 3 
    , fee1 
    , created 
    FROM transactions; 
+----+----------+--------+-------+---------------------+ 
| id | order_id | fee_id | value | created    | 
+----+----------+--------+-------+---------------------+ 
| 1 |  123 |  1 | 50.00 | 2015-01-01 00:00:00 | 
| 2 |  125 |  1 | 10.00 | 2015-01-02 00:00:00 | 
| 1 |  123 |  2 | 50.00 | 2015-01-01 00:00:00 | 
| 2 |  125 |  2 | 10.00 | 2015-01-02 00:00:00 | 
| 1 |  123 |  3 | 50.00 | 2015-01-01 00:00:00 | 
| 2 |  125 |  3 | 10.00 | 2015-01-02 00:00:00 | 
+----+----------+--------+-------+---------------------+ 


DROP TABLE IF EXISTS transactions_new; 

CREATE TABLE transactions_new AS 
SELECT id 
    , order_id 
    , 1 fee_id 
    , fee1 value 
    , created 
    FROM transactions 
UNION 
SELECT id 
    , order_id 
    , 2 
    , fee1 
    , created 
    FROM transactions 
UNION 
SELECT id 
    , order_id 
    , 3 
    , fee1 
    , created 
    FROM transactions; 

ALTER TABLE transactions_new ADD PRIMARY KEY(id,order_id,fee_id); 

SELECT * FROM transactions_new; 
+----+----------+--------+-------+---------------------+ 
| id | order_id | fee_id | value | created    | 
+----+----------+--------+-------+---------------------+ 
| 1 |  123 |  1 | 50.00 | 2015-01-01 00:00:00 | 
| 1 |  123 |  2 | 50.00 | 2015-01-01 00:00:00 | 
| 1 |  123 |  3 | 50.00 | 2015-01-01 00:00:00 | 
| 2 |  125 |  1 | 10.00 | 2015-01-02 00:00:00 | 
| 2 |  125 |  2 | 10.00 | 2015-01-02 00:00:00 | 
| 2 |  125 |  3 | 10.00 | 2015-01-02 00:00:00 | 
+----+----------+--------+-------+---------------------+ 
+0

'created' 컬럼은'transactions'에 있어야한다는 것을 알고 있습니다. – RandomSeed

0

... 다음 사항을 고려하십시오 ORDER_ID이 고유하지 않으면

INSERT INTO Transaction_fee(transaction_id, fee, amount) 
    SELECT t.id, 'fee1', o.fee1 
    FROM Transactions t 
    LEFT JOIN Order o USING(order_id) -- Assuming your current table is called 'Order' 
    UNION ALL 
    SELECT t.id, 'fee2', o.fee2 
    FROM Transactions t 
    LEFT JOIN Order o USING(order_id) 
    UNION ALL 
    ... 

, 당신은 여전히 ​​같은 방법을 구현할 수 있지만를 사용하여 기존 주문 테이블의 'id'열. 내가 할 수있는 일은 새로운 'Transactions'테이블의 마지막 열로 일시적으로이 'id'열을 포함하고,이를 사용하여 조인을 수행하고, Transactions_fee 테이블로 데이터를 마이그레이션 한 후에 임시 트랜잭션을 삭제합니다. id '열에 있습니다.