我试图完成的是,当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
但这不适用于我,我想?
那么我将如何创建这样的表(创建表...)或删除行语句? 提前谢谢!
答案 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 NULL
和ON UPDATE SET NULL
条款。如果指定
SET NULL
操作,请确保未将子表中的列声明为NOT NULL
。
请注意,该约束还有一个额外的好处,即确保mafia_id
中的tableA
值必须始终引用tableB
中的现有记录。