请查看以下声明
INSERT INTO Ongoing_Fees (currentDate, Gross_Fee, Insurance_Fee, Submit_Fee)
SELECT current_timestamp, New.Gross_Fee,
@InsuranceFee := (New.Gross_Fee)*(p.E_Fee/100),
@SubmitFee := @InsuranceFee-(p.s_Fee/100)
FROM Portfolio p
WHERE p.idPortfolio = New.idPortfolio;
这里我使用2个用户定义变量@InsuranceFee
和@SubmitFee
。如您所见,您可以通过从@SubmitFee
中扣除值来获得@InsuranceFee
。
现在,为了使其正常工作,必须首先评估@InsuranceFee
“。但是MySQL document下面会说
作为一般规则,除了在SET语句中,你永远不应该 为用户变量赋值并读取其中的值 声明。例如,要增加变量,这没关系:
SET @a = @a + 1;对于其他语句,例如SELECT,您可能会得到 你期望的结果,但这不能保证。在下面的 声明,您可能会认为MySQL会首先评估@a 做第二个任务:
SELECT @ a,@ a:= @ a + 1,...;但是,评估顺序为 涉及用户变量的表达式是未定义的。
那么,我可以在SELECT
内使用变量的最佳方式是什么?
更新
可能首先使用单独的SELECT语句将值分配到变量中更好吗?像下面的东西......
SET @InsuranceFee := New.Gross_Fee * ((SELECT E_Fee FROM Portfolio WHERE idPortfolio = New.idPortfolio)/100);
SET @SubmitFee := @InsuranceFee - ((SELECT s_FeeFROM Portfolio WHERE idPortfolio = New.idPortfolio)/100)
INSERT INTO Ongoing_Fees (currentDate, Gross_Fee, Insurance_Fee, Submit_Fee)
current_timestamp, New.Gross_Fee,
@InsuranceFee ,
@SubmitFee
答案 0 :(得分:0)
User-defined variables
不应该像这样使用。正如我的评论所述,没有理由不把它全部写出来。但是,如果您只是喜欢临时语法,则可以始终使用子查询:
INSERT INTO Ongoing_Fees (currentDate, Gross_Fee, Insurance_Fee, Submit_Fee)
SELECT ct, gross_fee, InsuranceFee, InsuranceFee-SubmitFee
FROM (
SELECT current_timestamp ct,
New.Gross_Fee,
New.Gross_Fee*p.E_Fee/100 as InsuranceFee,
p.s_Fee/100 as SubmitFee
FROM Portfolio p
WHERE p.idPortfolio = New.idPortfolio
) T