我会正常化您的设计和使用存储过程来插入付款如下:
完整的脚本在这里:http://pastie.org/1688269
希望这有助于:)
调用示例
call insert_payment('[email protected]',1,100);
call insert_payment('[email protected]',2,200);
call insert_payment('[email protected]',3,300);
call insert_payment('[email protected]',1,400);
call insert_payment('[email protected]',2,500);
mysql> select * from payments_view order by pay_id desc;
+--------+---------------------+-------------+---------------+--------+---------+----------------------+
| pay_id | pay_date | pay_type_id | pay_type_name | amount | cust_id| email |
+--------+---------------------+-------------+---------------+--------+---------+----------------------+
| 5 | 2011-03-19 01:34:28 | 2 | mastercard | 500.00 | 4| [email protected] |
| 4 | 2011-03-19 01:34:28 | 1 | visa | 400.00 | 4| [email protected] |
| 3 | 2011-03-19 01:34:28 | 3 | cash | 300.00 | 3| [email protected] |
| 2 | 2011-03-19 01:34:28 | 2 | mastercard | 200.00 | 2| [email protected] |
| 1 | 2011-03-19 01:34:28 | 1 | visa | 100.00 | 1| [email protected] |
+--------+---------------------+-------------+---------------+--------+---------+----------------------+
5 rows in set (0.00 sec)
存储过程
存储过程首先检查客户帐户是否已经存在,如果不存在,则创建一个然后插入支付数据。
delimiter ;
drop procedure if exists insert_payment;
delimiter #
create procedure insert_payment
(
in p_email varchar(512),
in p_pay_type_id tinyint unsigned,
in p_amount decimal(10,2)
)
begin
declare v_cust_id int unsigned default 0;
if not exists (select 1 from customers where email = p_email) then
insert into customers (email) values (p_email);
set v_cust_id = last_insert_id();
else
select cust_id into v_cust_id from customers where email = p_email;
end if;
insert into payments (cust_id, pay_type_id, amount)
values (v_cust_id, p_pay_type_id, p_amount);
select last_insert_id() as new_pay_id;
end#
表,视图和触发器
drop table if exists payments;
drop table if exists payment_types;
drop table if exists customers;
create table payment_types
(
pay_type_id tinyint unsigned not null auto_increment primary key,
name varchar(255) unique not null
)
engine=innodb;
create table customers
(
cust_id int unsigned not null auto_increment primary key,
email varchar(512) unique not null,
total_amount_paid decimal(10,2) not null default 0
)
engine=innodb;
create table payments
(
pay_id int unsigned not null auto_increment primary key,
cust_id int unsigned not null,
pay_type_id tinyint unsigned not null,
pay_date datetime not null,
amount decimal(10,2) not null default 0,
key (pay_date),
foreign key (cust_id) references customers(cust_id),
foreign key (pay_type_id) references payment_types(pay_type_id)
)
engine=innodb;
drop view if exists payments_view;
create view payments_view as
select
p.pay_id,
p.pay_date,
p.pay_type_id,
pt.name as pay_type_name,
p.amount,
c.cust_id,
c.email
from
customers c
inner join payments p on c.cust_id = p.cust_id
inner join payment_types pt on p.pay_type_id = pt.pay_type_id;
delimiter #
create trigger payments_before_ins_trig before insert on payments
for each row
begin
set new.pay_date = now();
update customers set total_amount_paid = total_amount_paid + new.amount
where cust_id = new.cust_id;
end#
delimiter ;
测试
insert into payment_types (name) values ('visa'),('mastercard'),('cash');
insert into customers (email) values ('[email protected]'),('[email protected]'),('[email protected]');
call insert_payment('[email protected]',1,100);
call insert_payment('[email protected]',2,200);
call insert_payment('[email protected]',3,300);
call insert_payment('[email protected]',1,400);
call insert_payment('[email protected]',2,500);
select * from payment_types order by pay_type_id;
select * from customers order by cust_id;
select * from payments order by pay_id;
select * from payments_view order by pay_id desc;
'payment_id'可能是一个很好的候选人 – drudge 2011-03-18 23:57:33
的概率是我给出的HTML表单,我只能输入一个电子邮件和金额 – pantelis 2011-03-19 00:02:20
payment_id将由da tabase,因此对于每个支付交易都是唯一的 – 2011-03-19 00:03:33