在更新级联上添加外键

时间:2014-10-15 09:21:09

标签: mysql sql foreign-keys

让我们说,我有2张桌子

用户

+----+--------+
| id | status |
+----+--------+
|  1 | A      |
|  2 | A      |
+----+--------+

制品

+----+-----+--------+
| id | uid | status |
+----+-----+--------+
|  1 |   1 | A      |
|  2 |   2 | A      |
|  3 |   2 | A      |
|  4 |   2 | A      |
|  5 |   1 | A      |
|  6 |   2 | A      |
|  7 |   2 | A      |
|  8 |   1 | A      |
|  9 |   2 | A      |
| 10 |   2 | A      |
+----+-----+--------+

如果我运行此查询,如何添加外键:

UPDATE user SET status='B' WHERE id=1 OR id=2;

结果将是:

用户

+----+--------+
| id | status |
+----+--------+
|  1 | B      |
|  2 | B      |
+----+--------+

制品

+----+-----+--------+
| id | uid | status |
+----+-----+--------+
|  1 |   1 | B      |
|  2 |   2 | B      |
|  3 |   2 | B      |
|  4 |   2 | B      |
|  5 |   1 | B      |
|  6 |   2 | B      |
|  7 |   2 | B      |
|  8 |   1 | B      |
|  9 |   2 | B      |
| 10 |   2 | B      |
+----+-----+--------+

或者换句话说,如果我更新列user.status,MySQL将自动使用相应的值更新列article.status

如何创建此外键?

2 个答案:

答案 0 :(得分:1)

这项工作不是外键可以完成。使用更新触发器,但为了更好地与数据库兼容,请首先对您的代码执行此操作。

触发码:

CREATE TRIGGER SetArticleStatus AFTER UPDATE ON user 
FOR EACH ROW 
BEGIN 
UPDATE `article` 
   SET status = NEW.status 
 WHERE uid = NEW.id
END 

答案 1 :(得分:0)

由于您的FOREIGN KEY仅为uid并且不知道status,因此只能使用外键来完成您想要的事情。对于on-update-trigger来说,这看起来是一个很好的用例。