在删除类别之前更新相关信息

时间:2018-08-20 16:03:37

标签: php mysql sql wordpress pdo

我有2个具有one-to-many关系的表:

                     posts table
___________________________________________________
| id | title | content | category_id | posts_order |                                        
|____|_______|_________|_____________|_____________|
| 1  | test1 | testing |     1       |       0     |   
| 2  | test2 | testing |     1       |       1     |   
| 3  | test3 | testing |     2       |       2     |   
| .  | ..... | ....... |     .       |       .     |   
|____|_______|_________|_____________|_____________|


       categories table
___________________________
| c_id | c_name | c_order |                                       
|______|________|_________|
|   1  |  cat1  |    0    |      
|   2  |  cat2  |    1    |      
|   3  |  cat3  |    2    |      
| .    | ..... | .......  |      
|______|_______|__________|

在删除和更新posts.category_id时,它们通过categories.c_idCASCADE加入。

我要寻找的是,在删除类别之前,将category_id更新为100,这是未分类的类别。

我尝试过:

global $wpdb;

//Category id to remove.
$remove_id = 2;

//Column to update
$data = array(
    "category_id" => 100
);

$where = array('category_id' => $remove_id);

//Update the posts that has the id 2
$wpdb->update('posts', $data, $where);

//Delete the category
$wpdb->delete( 'categories', array( 'c_id' => $remove_id ) );

但是我得到了这个错误:

WordPress database error: [Cannot add or update a child row: a foreign key constraint fails 

(`myposts`.`posts`, CONSTRAINT `posts_categories` FOREIGN KEY (`category_id`) REFERENCES 

`categories` (`c_id`) ON DELETE CASCADE ON UPDATE CASCADE)]
UPDATE `posts` SET `category_id` = '100' WHERE `category_id` = '2'

在删除category_id = 2的类别之前,如何将100 = c_id的帖子更新为2

1 个答案:

答案 0 :(得分:1)

由于ON UPDATE CASCADEForeign Keys锁定在child-table中,您遇到了这个问题。在这种情况下,您的child-tableposts

如果ON UPDATE CASCADEcategory_id)中的posts发生了更改,则categories的目的将是更新parent-table中的c_id字段。

例如,将categories表形式1上的001更改为category_id将会更改posts上的所有update字段以匹配进行更改(假设此更改允许使用数据类型)。

如果要保留此功能,则需要在parent-table而不是child上执行posts语句。

因此,您无需在update上执行此categories,而是更新cascade,然后将posts降到category_id 1}} s


嗯,因此,考虑到您对CASCADE的使用,我认为在当前设计中不会发生您想要的事情。由于update,您将无法category_id posts中的on update cascade;如果您尝试updatecategories设置{{ 1}},然后删除c_id = 100 where c_id = 2,您将同时删除所有c_id = 100posts

如果要保留category_id = 100类别中的on update cascade,建议从表中删除posts约束。

另外,使用deleted列作为属于category_id类别的指示是不好的做法。如果您想知道帖子的前一个类别该怎么办?

以这种方式更改deleted列通常也很不好,因为这意味着它们不容易被索引。考虑更改数据库设计以将id类别移动到某种历史记录表中。然后,您可以像往常一样在deleted上搜索记录,并根据需要仅包含posts类别。