我有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_id
和CASCADE
加入。
我要寻找的是,在删除类别之前,将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
?
答案 0 :(得分:1)
由于ON UPDATE CASCADE
将Foreign Keys
锁定在child-table
中,您遇到了这个问题。在这种情况下,您的child-table
是posts
。
如果ON UPDATE CASCADE
(category_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
;如果您尝试update
表categories
设置{{ 1}},然后删除c_id = 100 where c_id = 2
,您将同时删除所有c_id = 100
和posts
。
如果要保留category_id = 100
类别中的on update cascade
,建议从表中删除posts
约束。
另外,使用deleted
列作为属于category_id
类别的指示是不好的做法。如果您想知道帖子的前一个类别该怎么办?
以这种方式更改deleted
列通常也很不好,因为这意味着它们不容易被索引。考虑更改数据库设计以将id
类别移动到某种历史记录表中。然后,您可以像往常一样在deleted
上搜索记录,并根据需要仅包含posts
类别。