簡體   English   中英

PHP、MySQL、類別和子類別——刪除

[英]PHP, MySQL, categories, and subcategories – the deletion

我有一個像這樣的 MySQL 表:

CREATE TABLE categories (
    ID INT NOT NULL,
    Name VARCHAR(100) NULL,
    Parent INT NULL,
    PRIMARY KEY (ID)
) Engine=InnoDB

我想確保在父母被刪除時刪除所有孩子。 起初,我想通過在表中添加一個這樣的外鍵來做到這一點:

ALTER TABLE categories ADD CONSTRAINT FOREIGN KEY Parent(Parent) 
REFERENCES categories(ID) ON DELETE CASCADE

這不起作用。 我也嘗試過內部關系,但沒有成功。

父母和他們的孩子與一個遞歸的 PHP 函數聯系在一起。 MySQL 有沒有辦法實現這個目標,還是應該使用 PHP 來完成?

您已經以相反的方式定義了外鍵。
您應該將其定義為:

ALTER TABLE categories ADD CONSTRAINT FOREIGN KEY (id)
REFERENCES Parent(Parent) ON DELETE CASCADE 

為我工作。

#Server version: 5.1.42-community MySQL Community Server (GPL)
create table lists(
   id int not null
  ,parent int
  ,primary key(id)
  ,foreign key(parent) references lists(id) on delete cascade
) Engine=InnoDb;

insert into lists(id, parent) values(1, null);
insert into lists(id, parent) values(2, 1);
insert into lists(id, parent) values(3, 2);
insert into lists(id, parent) values(4, 3);

mysql> select * from lists;
+----+--------+
| id | parent |
+----+--------+
|  1 |   NULL |
|  2 |      1 |
|  3 |      2 |
|  4 |      3 |
+----+--------+
4 rows in set (0.00 sec)

mysql>
mysql> delete from lists where id = 1;
Query OK, 1 row affected (0.02 sec)

mysql>
mysql> select * from lists;
Empty set (0.00 sec)

你需要這樣的東西:

drop table if exists categories;
create table categories
(
cat_id int unsigned not null auto_increment primary key,
name varchar(255) not null,
parent_id int unsigned null,
foreign key (parent_id) references categories(cat_id) on delete cascade
)
engine = innodb;

羅尼斯,富,你是對的。 它真的有效。 :-)

我做錯的事情是通過我的 PHP 應用程序為第一個父級設置了“0”。 當然,如果我輸入“0”(沒有 id 為“0”的父對象),那么我就違反了外鍵規則。 所以,我所要做的就是稍微編輯我的 INSERT 語句。 非常感謝您讓我注意到這一點。 謝謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM