0

我试图完成的是,当 tableB 中的一行被删除时,我想更新 tableA 中的行。

tableA的布局是这样的:

+----------------------------+--------------+------+-----+---------------------+----------------+
| Field                      | Type         | Null | Key | Default             | Extra          |
+----------------------------+--------------+------+-----+---------------------+----------------+
| user_id                    | int(11)      | NO   | PRI | NULL                | auto_increment |
| nickname                   | varchar(32)  | NO   |     | NULL                |                |
| password                   | varchar(129) | NO   |     | NULL                |                |
| mafia_id                   | int(11)      | NO   |     | 0                   |                |
+----------------------------+--------------+------+-----+---------------------+----------------+

和表B这个:

+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| mafia_id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| mafia_name  | varchar(32) | NO   |     |         |                |
| mafia_tag   | varchar(5)  | NO   |     |         |                |
| mafia_color | int(11)     | NO   |     | 0       |                |
| mafia_car   | int(11)     | NO   |     | 0       |                |
| mafia_base  | int(11)     | NO   |     | 0       |                |
+-------------+-------------+------+-----+---------+----------------+

当 tableB 中相应的 mafia_id 被删除时,我想将所有 tableA.mafia_id 设置为 0。

我在文档中读到数据库会自动为您执行此操作,但您必须在创建表时指定一些内容(在 CREATE TABLE 中,create_definition: | CHECK (expr)?)。文档对我来说有点不清楚。

我还阅读了这个主题: 创建一个触发器,当另一个表中的列更新时更新一个表上的列

但这不适用于我,我想?

那么我将如何创建这样的表(创建表...)或删除行语句?提前致谢!

4

1 回答 1

2

由于您使用的是 InnoDB,因此您可以使用外键约束来实现这一点:

ALTER TABLE tableA
  MODIFY mafia_id INT(11) NULL,
  ADD FOREIGN KEY (mafia_id) REFERENCES tableB (mafia_id) ON DELETE SET NULL

如手册中所述:

  • SET NULL:删除或更新父表中的行,并将子表中的外键列设置为NULL。这仅在外键列没有NOT NULL指定限定符时才有效。ON DELETE SET NULLON UPDATE SET NULL子句都受支持。

    如果您指定一个SET NULL操作,请确保您没有将子表中的列声明为NOT NULL.

请注意,该约束具有额外的优势,即确保in 中的mafia_idtableA必须始终引用 in 中的现有记录tableB

于 2012-08-04T22:59:38.900 回答