所以我接管了一个数据库,并且在理解这四行的含义时遇到了一些麻烦。我意识到这些行正在强制执行数据库的关系方面,但我希望确切地指出这种语法正在做什么。
Key x (y)
:Constraint
ON DELETE SET NULL, ON UPDATE CASCADE
我应该对此代码段进行任何更改吗?
KEY `location_sh` (`dep_name`,`cat_name`,`loc_name`),
KEY `owner_sh` (`owner`),
CONSTRAINT `location_sh` FOREIGN KEY (`dep_name`, `cat_name`, `loc_name`)
REFERENCES `locations` (`dep_name`, `cat_name`, `loc_name`)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `owner_sh` FOREIGN KEY (`owner`) REFERENCES `users` (`username`)
ON DELETE SET NULL ON UPDATE CASCADE
答案 0 :(得分:3)
此:
KEY `location_sh` (`dep_name`,`cat_name`,`loc_name`)
..定义了一个名为“location_sh”的覆盖索引。我指定了“覆盖索引”,因为索引声明包含多个列。
KEY `owner_sh` (`owner`)
...不使用多个列,因此它只是一个index。 KEY
是索引的MySQL特定语法 - 虽然目前没有涵盖ANSI,但每个数据库都实现索引并使用类似的术语(一种方式之后)。
剩余的CONSTRAINT声明:
CONSTRAINT `location_sh` FOREIGN KEY (`dep_name`, `cat_name`, `loc_name`)
REFERENCES `locations` (`dep_name`, `cat_name`, `loc_name`)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `owner_sh` FOREIGN KEY (`owner`) REFERENCES `users` (`username`)
ON DELETE SET NULL ON UPDATE CASCADE
...是foreign key constraints。它们用于强制引用完整性 - 定义的列只能包含在语句的REFERENCES
部分中指定的表列中已存在的值。
关于ON DELETE ...
- 文档说:
InnoDB采取的任何UPDATE或DELETE操作都会尝试更新或删除父表中具有子表中某些匹配行的候选键值,这取决于使用ON UPDATE和ON DELETE子条款指定的引用操作FOREIGN KEY子句。当用户尝试从父表中删除或更新行,并且子表中有一个或多个匹配的行时,InnoDB支持关于要采取的操作的五个选项。如果未指定ON DELETE或ON UPDATE,则默认操作为RESTRICT。
除了语法(看似正确)之外,我们没有任何背景可以说出对错。这完全取决于您的数据以及该数据的业务规则。
答案 1 :(得分:2)
关于这些项目的Mysql页面:http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
1)Key定义表搜索的键。密钥由db引擎编制索引,以便为查询提供更快的结果。
2)约束条件适用于外键的“规则”。这表示这些键dep_name, cat_name, loc_name
都指向locations
表中具有相同名称的列
3)ON DELETE操作在提供的链接中有很好的描述。
4)它看起来不错......虽然在不了解情况的情况下很难说出来