1

次のような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 を使用して行う必要がありますか?

4

4 に答える 4

2

外部キーを逆に定義しました。
次のように定義する必要があります。

ALTER TABLE categories ADD CONSTRAINT FOREIGN KEY (id)
REFERENCES Parent(Parent) ON DELETE CASCADE 
于 2011-01-07T20:54:29.440 に答える
1

私のために働きます。

#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)
于 2011-01-07T22:46:25.820 に答える
0

ロニス、フー、その通りだ。それは実際に動作します。:-)

私が間違っていたのは、PHP アプリケーションを介して最初の親に「0」を設定することでした。もちろん、「0」を指定した場合 (ID「0」の親が存在しない場合)、外部キーの規則に違反しています。そのため、INSERT ステートメントを少し編集するだけで済みました。これを私に知らせてくれてありがとう。みんなありがとう!

于 2011-01-08T10:22:59.453 に答える
0

次のようなものが必要です。

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;
于 2011-01-07T21:56:42.303 に答える