MySQL将单行值拆分为多个插入
以下是我当前的订单销售表结构(简化): 以下是我希望它成为的: 交易:MySQL将单行值拆分为多个插入,mysql,database,select,insert,Mysql,Database,Select,Insert,以下是我当前的订单销售表结构(简化): 以下是我希望它成为的: 交易: id|order_id|total|created 交易费用: id|transaction_id|fee|amount 我将如何着手处理原始订单销售记录,并将它们移到这个新的2表结构中 我知道INSERT…SELECT for MySQL,这就是我目前所知道的: INSERT INTO transactions (order_id, total, created) SELECT order_id, tota
id|order_id|total|created
交易费用:
id|transaction_id|fee|amount
我将如何着手处理原始订单销售记录,并将它们移到这个新的2表结构中
我知道INSERT…SELECT for MySQL,这就是我目前所知道的:
INSERT INTO transactions (order_id, total, created)
SELECT order_id, total, created
FROM order_sales
但是我还需要抓取fee1…fee(n)并将它们放入transaction_fee表中,最好是在相同的查询中,因为fee表将transactions主键作为外键,因此需要准确
因此,它变成:
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
有什么想法吗?我知道更改数据库的结构需要进行许多其他更改,在许多情况下可能需要大量工作,但是我认为更改数据库的结构将使您的工作更具可扩展性和直观性 例如,如果您希望在将来添加一种新的费用,则需要添加一个新列并编辑许多现有查询,因此我建议将您的销售表拆分为3个相关表: 订单(OrderID,Total,date created)//不确定是否需要总计,可以通过查询选择,我添加它只是为了以防万一 FeeType(Fee\u ID、Fee\u Title)//所有费用类型(fee1、fee2等)都应作为记录存储在此处 OrderFees(OrderID,Fees\u ID,Amount)//这里我假设每次都会添加已支付的金额,如果不是,您可以在FeeTypes表中生成“Amount”
现在,如果您想发送一个事务,如果您只想保存订单摘要,则可以向Orders表发送一个完整的insert语句;否则,如果您想发送关于每项费用的详细信息,则将向OrderFees表发送insert查询,其中包含OrderID、FeeID和到期金额 考虑以下几点
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 |
+----+----------+--------+-------+---------------------+
如果“订单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
...
如果order_id不是唯一的,您仍然可以使用现有order表的“id”列实现相同的方法。我要做的是,暂时将此“id”列作为新“Transactions”表的最后一列,使用它进行联接,并在完成将数据迁移到Transactions\u费用表后,删除临时的“Transactions.id”列。将其描述为一种结构是对该术语的过度使用。但是我看到了你的方向,这很好。你当前表中的“order\u id”是唯一的吗?@sn00k4h这是一个合理的假设。我认为OP正试图这样做。我理解创建的
列应该保留在事务中。
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
...