Mysql触发return坏股价值

Mysql trigger return bad stocks value

我的触发器需要帮助。我有两个 tables 'product' 和 'storage'。这个想法是当我 运行 在 table 'storage' 列 'flag' 上更新时,触发器必须为正确的 ID 计算库存,但总是 return 所有产品的错误值,请见附件。正确的库存价值应该是 'Test' 10 件和 'aaaaaa' 5 件。感谢帮助。

产品table:

CREATE TABLE `products` (
  `id` int(11) NOT NULL,
  `subcategory_id` int(11) NOT NULL,
  `product_name` varchar(255) COLLATE utf8_bin NOT NULL,
  `product_description` varchar(255) COLLATE utf8_bin NOT NULL,
  `product_price` int(11) NOT NULL,
  `product_type` varchar(1) COLLATE utf8_bin NOT NULL,
  `product_quantity` int(11) NOT NULL
) ENGINE=InnoDB;

INSERT INTO `products` (`id`, `subcategory_id`, `product_name`, `product_description`, `product_price`, `product_type`, `product_quantity`) VALUES
(45, 11, 'Test', 'test', 1111, 'G', 15),
(46, 11, 'aaaaaa', 'aaaaaa', 12, 'G', 15);

存储table:

CREATE TABLE `storage` (
  `id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `flag` varchar(1) COLLATE utf8_bin NOT NULL DEFAULT 'A'
) ENGINE=InnoDB;

INSERT INTO `storage` (`id`, `product_id`, `flag`) VALUES
(46, 45, 'A'),
(47, 45, 'A'),
(48, 45, 'A'),
(49, 45, 'A'),
(50, 45, 'A'),
(51, 45, 'A'),
(52, 45, 'A'),
(53, 45, 'A'),
(54, 45, 'A'),
(55, 45, 'A'),
(56, 46, 'A'),
(57, 46, 'A'),
(58, 46, 'A'),
(59, 46, 'A'),
(60, 46, 'A');

mysql 触发器:

DELIMITER $$
CREATE TRIGGER `tg_ai_table22` AFTER UPDATE ON `storage` FOR EACH ROW UPDATE products
   SET products.product_quantity = (SELECT COUNT(product_quantity)
FROM STORAGE, (SELECT id FROM products) as prod
WHERE prod.id = storage.product_id AND storage.flag = 'A' LIMIT 1)
$$
DELIMITER ;

PHP 函数: 手推车控制器:

public function addToCart()
    {
        $id = $this->uri->segment(3);
        $data = $this->ProductModel->selectProductToCart($id);
        $cartData = array();
        foreach ($data as $datas) {
            $cartData = array(
                'id' => $datas->id,
                'qty' => 1,
                'price' => $datas->product_price,
                'name' => $datas->product_name
            );
        }
        $this->cart->insert($cartData) ? $this->db->limit(1)->set('flag', 'C')->where('product_id', $cartData['id'])->where('flag', 'A')->update('storage') : '';
    }

public function updateCart()
    {
        $updatedCartData = $this->input->post();

        for ($i = 1; $i <= sizeof($this->cart->contents()); $i++)
        {
            if ($this->cart->contents()[$updatedCartData[$i]['rowid']]['rowid'] == $updatedCartData[$i]['rowid'])
            {
                if ($this->cart->contents()[$updatedCartData[$i]['rowid']]['qty'] > $updatedCartData[$i]['qty'])
                {
                    $result = $this->cart->contents()[$updatedCartData[$i]['rowid']]['qty'] - $updatedCartData[$i]['qty'];
                    for ($j = 1; $j <= $result; $j++)
                    {
                        $this->db->limit(1)->set('flag', 'A')->where('product_id',
                            $this->cart->contents()[$updatedCartData[$i]['rowid']]['id'])->where('flag',
                            'C')->update('storage');
                    }
                } else
                {
                    $result = $updatedCartData[$i]['qty'] - $this->cart->contents()[$updatedCartData[$i]['rowid']]['qty'];
                    for ($j = 1; $j <= $result; $j++)
                    {
                        $this->db->limit(1)->set('flag', 'C')->where('product_id',
                            $this->cart->contents()[$updatedCartData[$i]['rowid']]['id'])->where('flag',
                            'A')->update('storage');
                    }
                }
            }
        }

        $this->cart->update($updatedCartData);
        $this->session->set_flashdata('category_success', 'Kosik bol aktualizovany.');
        redirect('Cart');
    }

产品控制器:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Product extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->model('ProductModel');
    }

    public function index($id)
    {
        $data['product'] = $this->ProductModel->selectProduct($id);
        $this->load->view('HeaderView');
        $this->load->view('UpperMenuView');
        $this->load->view('LeftMenuView');
        $this->load->view('ProductView', $data);
        $this->load->view('FooterView');
    }
}

产品型号:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class ProductModel extends CI_Model
{
    private $table = 'products';

    public function __construct()
    {
        parent::__construct();
    }

    function selectProduct($id)
    {
        return $this->db->get_where($this->table, array('subcategory_id' => $id))->result();
    }

    function selectProductToCart($id)
    {
        return $this->db->get_where($this->table, array('id' => $id))->result();
    }

    public function insertProduct($data)
    {
        $this->db->insert($this->table, $data);
    }

    public function insertProductToStorage($data)
    {
        $this->db->insert('storage', $data);
    }
}

产品视图:

<div class="col-md-9">
    <?php $this->load->view('FlashMessagesView'); ?>
    <ul class="list-unstyled" id="products" data-role="list">
        <?php foreach ($product as $value): ?>
            <li class="span3 col-md-3">
                <div class="thumbnail">
                    <a href="product_details.html"><img src="<?php echo base_url('assets/img/12.jpg'); ?>"/></a>
                    <div class="caption" style="height: 300px; overflow: hidden">
                        <h5><?php echo $value->product_name; ?></h5>
                        <p><?php echo $value->product_description; ?></p>
                    </div>
                    <div class="product_footer caption">
                        <?php if ($value->product_quantity == 0) { ?>
                            <p style="text-align: center"><span style="color:orange"><b>Ordered on request.</b></span></p>
                        <?php } else { ?>
                            <p style="text-align: center">
                                <span style="color:green">
                                    <b>In stock <?php echo $value->product_quantity ?> pcs.</b>
                                </span>
                            </p>
                        <?php } ?>
                        <h4>
                            <a type="button" href="<?php echo base_url('Cart') ?>" id="<?php echo $value->id ?>"
                               class="btn btn-success">Buy</a>
                            <span class="pull-right"><?php echo $value->product_price; ?> &euro;</span>
                        </h4>
                    </div>
                </div>
            </li>
        <?php endforeach; ?>
    </ul>
</div>

你的trigger写错了,是make update for all products,不管id。

要仅针对具有更新标志的产品进行更改,请将触发器中的更新语句更改为以下内容:

UPDATE products
SET products.product_quantity = 
    (   
        SELECT COUNT(product_quantity)
        FROM STORAGE, (SELECT id FROM products) as prod
        WHERE prod.id = storage.product_id 
        AND storage.flag = 'A' LIMIT 1
    )
where id = new.product_id

我们所做的是添加 where id = new.product_id 以仅针对更新的产品标志进行更新。

而且,我认为你更新库存的方式不是最优的,为什么每次更新时,你都重新计算库存?