【问题标题】:Mysql rows getting deleted after an unrelated insertion action happens in another table在另一个表中发生不相关的插入操作后,Mysql 行被删除
【发布时间】:2015-01-27 15:52:27
【问题描述】:

我会尽量简单地解释这一点,因为它涉及一个电子商务音乐网站。

所以我有一个基于 CakePHP 的应用网站,这是一个电子商务网站,我们销售在线音乐。

我遇到的问题是,在有人购买专辑后,该专辑的流派行被删除,然后专辑不包含任何详细说明其所属音乐流派的行。

简单来说:

  1. id=65 的专辑包含 5,7 和 10 的流派。这是详细说明流派的表格的样子:

    专辑类型(表)

      fk_genre   fk_album
         12         87
         9          87
         5          65
         7          65
         10         65
    

用户购买 id=65 的相册后,包含fk_album id 的album_genre 表行将被删除。

      fk_genre   fk_album
         12         87
         9          87

当用户购买专辑时会发生什么?

  1. 用户使用信用卡或店内信用卡付款
  2. 如果接受付款,则继续创建 MusicItem 行:

    2.1 MusicItem row contains:
           fk_album, fk_receipt, fk_user, downloads
    
  3. 继续增加专辑表中专辑的销售编号

当有人购买专辑时,附近或执行的代码不会编辑/处理album_genre 表,或任何其他地方,除非您在后端创建专辑以添加到商店...

我怀疑这可能是数据库的问题?我似乎无法在日志或调试日志或任何东西中找到问题 =/ 需要一些想法帮助来解决此错误。

更新:

  • 打了SHOW TRIGGERS,然后空手而归。
  • 发现album_genre 有 3 个约束,即使它只有 2 列:

      - Columns are: fk_album, fk_genre
      - Constraints are `PRIMARY`, `FOREIGN KEY` and `FOREIGN KEY`
    

更新 2:

  • 显示步骤 3 中的代码片段

    public function incrementSales($idAlbum)
    {
        $parameters = array(
                    'fields'=>array('Album.album_sales'),
                    'recursive'=>-1,
                    'conditions'=>array('Album.id_album'=>$idAlbum)
        );
    
        $album = $this->find('first',$parameters);
        $newQuantity = $album['Album']['album_sales'] + 1;
        $this->read(null,$idAlbum);
        $this->set('album_sales',$newQuantity);
    
        if($this->save())
            return true;
        else
            return false;
     }
    

【问题讨论】:

  • 你有什么触发器吗?正在执行某些操作以删除数据,而不仅仅是消失。
  • 我刚刚对数据库执行了SHOW TRIGGERS sql,结果返回为空
  • 据我所知,您的第 3 步是处理任何查询的唯一代码行。我们可以看看那段代码

标签: php mysql sql cakephp lamp


【解决方案1】:

我终于明白了,

顶部修复我重新创建表的问题。旧的(有问题的)表如下所示:

  fk_genre   fk_album
     5          37
     9          37
     12         89
     3          89
     67         89      

新的(工作)表结构如下所示:

  id   fk_genre   fk_album
   1      5          37
   2      9          37
   3      12         89
   4      3          89
   5      67         89

问题与表中的一些混乱有关,因为没有设置索引,只有两个主键 fk_genre 和 fk_album。

我认为如果我添加一个索引,它肯定会有助于数据结构和排序,留下用 INDEX id 区分每一行的工作,而不是 fk_genre 和 fk_album 的组合,它奏效了!

编辑:

忘了提到处理该表的 AlbumGenre.php 的 Model 类没有指定主键设置,所以我也猜测 CakePHP 对使用什么作为主键感到困惑并且可能使用了两者中的任何一个。

 public  $primaryKey = 'id';

【讨论】:

    【解决方案2】:

    我会先检查触发器。 听起来您的代码正试图根据销量减少您的专辑库存,这显然是错误的。所以我会运行查看触发器。

    另外,我会用 grep 搜索您的代码以获取对 album_genre 表的引用。它可能是在销售完成时调用的 PHP 中的某些内容。

    【讨论】:

    • 这是一个电子销售,所以我不会减少任何库存。我确实发现album_genre 有3 个CONSTRAINTS,尽管它有2 列:fk_genre 和fk_album。约束为:PRIMARYFOREIGN KEYFOREIGN KEY
    • 看看 save() 命令做了什么会很有趣。如果没有触发器删除记录,那么 save() 似乎是最有可能的罪魁祸首。
    • 这是来自 CakePHP 框架的方法,不要认为它是罪魁祸首,我认为罪魁祸首可能是某个地方的约束导致了混乱,这与两个 FK 的组合有关,但我再次怀疑,我还没有找到实际证据。我会继续寻找......
    【解决方案3】:

    检查/搜索任何级联关键字。我的猜测是删除的记录与使用级联的另一个表有关系。

    【讨论】:

      【解决方案4】:

      检查/搜索任何级联关键字。我的猜测是删除的记录与使用级联的另一个表有关系。

      您是否尝试过使用 root 执行“SHOW_TRIGGERS”?

      【讨论】:

      • 是的,我是空的。
      猜你喜欢
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 2019-05-20
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多