如何创建一个在更改内容时自动更新另一个表的表?

时间:2012-08-04 22:55:14

标签: mysql sql database

我试图完成的是,当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                   |                |
+----------------------------+--------------+------+-----+---------------------+----------------+

和tableB这个:

+-------------+-------------+------+-----+---------+----------------+
| 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)?)。文档对我来说有点不清楚。

我也读过这个话题: Create a trigger that updates a column on one table when a column in another table is updated

但这不适用于我,我想?

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

1 个答案:

答案 0 :(得分:2)

由于您使用的是InnoDB,因此可以使用foreign key constraint

实现此目的
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

  •   

请注意,该约束还有一个额外的好处,即确保mafia_id中的tableA值必须始终引用tableB中的现有记录。