Mysql 行在另一个 table 中发生不相关的插入操作后被删除
Mysql rows getting deleted after an unrelated insertion action happens in another table
我会尽可能简单地解释这一点,因为它涉及到一个电子商务音乐网站。
所以我有一个基于 CakePHP 的应用程序网站,它是一个电子商务网站,我们销售在线音乐。
我遇到的问题是,在有人购买专辑后,该专辑的流派行被删除,然后该专辑不包含任何详细说明其所属音乐流派的行。
简单来看:
id=65 的专辑包含流派 5,7 和 10。这就是 table 详细描述流派的样子:
album_genre (table)
fk_genre fk_album
12 87
9 87
5 65
7 65
10 65
用户购买 id=65 的相册后,包含该 fk_album
id 的 album_genre
table 行被删除。
fk_genre fk_album
12 87
9 87
用户购买专辑后会发生什么?
- 用户使用卡或店内信用支付
如果接受付款,则继续创建 MusicItem 行:
2.1 MusicItem row contains:
fk_album, fk_receipt, fk_user, downloads
继续增加专辑中专辑的销量 table
当有人购买相册时,或在任何其他地方(除非您在要添加到商店的后端...
我怀疑这可能是数据库的问题?我似乎无法在日志或调试日志或任何东西中找到问题 =/ 需要一些想法帮助来解决此错误。
更新:
- 做了
SHOW TRIGGERS
结果空手而归。
发现 album_genre
有 3 个约束,即使它只有 2 列:
- Columns are: fk_album, fk_genre
- Constraints are `PRIMARY`, `FOREIGN KEY` and `FOREIGN KEY`
更新二:
显示第 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;
}
我会先检查触发器。
听起来您的代码试图根据销售额减少您的专辑库存,这显然是错误的。所以我会 运行 查看触发器。
此外,我会在您的代码中查找对 album_genre table 的引用。它可能是 PHP 中的某个东西,在销售完成时被调用。
Check/search 用于任何级联关键字。我的猜测是使用级联与另一个 table 相关的已删除记录。
Check/search 用于任何级联关键字。我的猜测是与另一个 table 使用级联关联的已删除记录。
你试过 'SHOW_TRIGGERS' root 吗?
我终于想通了,
最重要的是修复我重新创建 table 的问题。旧的(有问题的)table 看起来像这样:
fk_genre fk_album
5 37
9 37
12 89
3 89
67 89
新的(有效的)table 结构如下所示:
id fk_genre fk_album
1 5 37
2 9 37
3 12 89
4 3 89
5 67 89
这个问题与 table 中的一些混淆有关,因为没有设置 INDEX,只有两个主键 fk_genre 和 fk_album。
我想如果我添加一个索引,它肯定会有助于数据结构和顺序,留下用 INDEX id 区分每一行的工作,而不是 fk_genre 和 fk_album 的组合, 它奏效了!
编辑:
忘记提到处理 table 的 AlbumGenre.php 的模型 class 没有指定主键设置,所以我猜 CakePHP 也有对于将什么用作主键感到困惑,并且可能使用了两者中的任何一个。
public $primaryKey = 'id';
我会尽可能简单地解释这一点,因为它涉及到一个电子商务音乐网站。
所以我有一个基于 CakePHP 的应用程序网站,它是一个电子商务网站,我们销售在线音乐。
我遇到的问题是,在有人购买专辑后,该专辑的流派行被删除,然后该专辑不包含任何详细说明其所属音乐流派的行。
简单来看:
id=65 的专辑包含流派 5,7 和 10。这就是 table 详细描述流派的样子:
album_genre (table)
fk_genre fk_album 12 87 9 87 5 65 7 65 10 65
用户购买 id=65 的相册后,包含该 fk_album
id 的 album_genre
table 行被删除。
fk_genre fk_album
12 87
9 87
用户购买专辑后会发生什么?
- 用户使用卡或店内信用支付
如果接受付款,则继续创建 MusicItem 行:
2.1 MusicItem row contains: fk_album, fk_receipt, fk_user, downloads
继续增加专辑中专辑的销量 table
当有人购买相册时,或在任何其他地方(除非您在要添加到商店的后端...
我怀疑这可能是数据库的问题?我似乎无法在日志或调试日志或任何东西中找到问题 =/ 需要一些想法帮助来解决此错误。
更新:
- 做了
SHOW TRIGGERS
结果空手而归。 发现
album_genre
有 3 个约束,即使它只有 2 列:- Columns are: fk_album, fk_genre - Constraints are `PRIMARY`, `FOREIGN KEY` and `FOREIGN KEY`
更新二:
显示第 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; }
我会先检查触发器。 听起来您的代码试图根据销售额减少您的专辑库存,这显然是错误的。所以我会 运行 查看触发器。
此外,我会在您的代码中查找对 album_genre table 的引用。它可能是 PHP 中的某个东西,在销售完成时被调用。
Check/search 用于任何级联关键字。我的猜测是使用级联与另一个 table 相关的已删除记录。
Check/search 用于任何级联关键字。我的猜测是与另一个 table 使用级联关联的已删除记录。
你试过 'SHOW_TRIGGERS' root 吗?
我终于想通了,
最重要的是修复我重新创建 table 的问题。旧的(有问题的)table 看起来像这样:
fk_genre fk_album
5 37
9 37
12 89
3 89
67 89
新的(有效的)table 结构如下所示:
id fk_genre fk_album
1 5 37
2 9 37
3 12 89
4 3 89
5 67 89
这个问题与 table 中的一些混淆有关,因为没有设置 INDEX,只有两个主键 fk_genre 和 fk_album。
我想如果我添加一个索引,它肯定会有助于数据结构和顺序,留下用 INDEX id 区分每一行的工作,而不是 fk_genre 和 fk_album 的组合, 它奏效了!
编辑:
忘记提到处理 table 的 AlbumGenre.php 的模型 class 没有指定主键设置,所以我猜 CakePHP 也有对于将什么用作主键感到困惑,并且可能使用了两者中的任何一个。
public $primaryKey = 'id';