用于更新表中列的SQL查询

时间:2015-07-25 04:33:27

标签: sql

我有一个基于代码的网站,其中员工必须通过优惠券代码更新他们的奖励积分,并且当该代码反映他们的帐户意味着当他们的帐户中的积分更新时他们能够在网站上购物。但是代码的限制是一旦使用了代码就被删除了。有时我发现客户的查询是他们用提供的代码更新了他们的帐户,但代码没有反映帐户并从数据库中删除,因此他们现在无法再次使用代码我希望代码只在代码时删除更新其帐户中的积分。我有另一个名为customer_reward的表,其中代码在客户帐户中添加点后保存,但不反映帐户充值的代码未保存在该表中,所以我希望只有在代码保存在customer_reward表中时才删除该代码。

完整的代码如下:

{
        "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "AlertName": {
                    "type": "string"
            },
        "Location": {
                    "type": "string",
             "defaultValue": "East US"
            },
        "ResourceGroup": {
                    "type": "string"
            },
        "ResourceName": {
                    "type": "string"
            }
        },
    "resources": [{
                "apiVersion": "2014-04-01",
                "name": "[parameters('AlertName')]",
                "type": "microsoft.insights/alertrules",
        "location": "[parameters('Location')]",
                "tags": {
                    "displayName": "AppInsightsAlert"
                },
                "properties": {
                    "name": "[concat('AppInsightsAlert ', parameters('AlertName'))]",
                    "description": "[concat('App Insights Alert ', parameters('AlertName'))]",
                    "isEnabled": true,
                    "condition": {
                            "odata.type": "Microsoft.Azure.Management.Insights.Models.ThresholdRuleCondition",
                            "dataSource": {
                                "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleMetricDataSource",
                                "resourceUri": "[concat('/subscriptions/<subscription id>/resourcegroups/',  parameters('ResourceGroup'), '/providers/microsoft.insights/components/',  parameters('ResourceName'))]",
                                "metricName": "view.count"
                            },
                            "threshold": 1,
                    "windowSize": "PT5M"
                    },
                    "action": {
                            "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleEmailAction",
                            "sendToServiceOwners": true,
                        "customEmails": []
                    }
                }
        }]
}

3 个答案:

答案 0 :(得分:0)

我认为问题在于您是否真的不知道是否在 oc_customer_reward 表中插入了记录。

有多种方法可以解决这个问题。

  1. 您可以修改删除查询以检查 oc_customer_reward 表。这可能是:

     DELETE Table1
     FROM Table1
     INNER JOIN Table2 ON Table1.ID = Table2.ID
    
  2. 创建一个触发器,只要在 oc_customer_reward 中插入记录,该触发器将删除 oc_reward 表中的数据。您可以查找触发器here

    CREATE TABLE reward_code_table
       (reward_code INT, random_col VARCHAR(50))
    ;
    
    INSERT INTO reward_code_table
       (`reward_code`, `random_col`)
    VALUES
       (1, 'First code'),
       (2, 'Second code'),
       (3, 'Third code')
    ;
    
    CREATE TABLE insert_code_table
        (customer_code INT, another_random_col VARCHAR(50))
    ;
    
    DELIMITER //
    CREATE TRIGGER del_after_insert
    AFTER INSERT
    ON insert_code_table
    FOR EACH ROW
    BEGIN
       DELETE FROM reward_code_table WHERE reward_code = NEW.customer_code;
    END;
    //
    DELIMITER ;
    
    INSERT INTO insert_code_table(customer_code, another_random_col)
    VALUES (2, "del 2 from reward table");
    
  3. 插入一个表后,它会从另一个表中删除记录。

    您可以结帐样本SQLFiddle。请注意,我将分隔符保留为小提琴示例中的//

    还要考虑使用预准备语句来防止基本的mysql注入。

答案 1 :(得分:0)

员工与客户之间的关系是什么?

您正在通过emp_ID查询oc_customer,并从中获取customer_id。那么oc_customer在emp_id上是唯一的吗?如果没有,那么您最终得到的客户(以及您将应用奖励的那个)实际上是随机的。相反,您需要传入客户的customer_id而不是emp_id。

另一件事;您直接在SQL语句中使用&#34; $ POST&#34; ed值。这使您开始进行SQL注入攻击。查看How can I prevent SQL injection in PHP?

答案 2 :(得分:0)

这里最好的方法可能是创建一个触发器(用于删除代码),只有在更新点数时才会触发。

CREATE TRIGGER trigger_name
AFTER INSERT 
   ON table_name FOR EACH ROW

BEGIN

   -- logic for deleting the corresponding CODE

END;

希望这会让你更接近你想要的东西。

Ak