使用InnoDB的MySQL语法

时间:2011-06-08 22:44:27

标签: mysql sql ddl

所以我接管了一个数据库,并且在理解这四行的含义时遇到了一些麻烦。我意识到这些行正在强制执行数据库的关系方面,但我希望确切地指出这种语法正在做什么。

  1. Key x (y)
    它是什么?/ location_sh与dep_name和cat_name以及loc_name的关系是什么?
  2. Constraint
    这似乎是让所有者与表用户中的列用户名相关联,但为什么需要约束部分(即约束location_sh做什么)?
  3. ON DELETE SET NULL, ON UPDATE CASCADE
    只需在删除或更改用户名时检查是否反映了删除或更改。
  4. 我应该对此代码段进行任何更改吗?

    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
    

2 个答案:

答案 0 :(得分:3)

此:

KEY `location_sh` (`dep_name`,`cat_name`,`loc_name`)

..定义了一个名为“location_sh”的覆盖索引。我指定了“覆盖索引”,因为索引声明包含多个列。

KEY `owner_sh` (`owner`)

...不使用多个列,因此它只是一个indexKEY是索引的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)它看起来不错......虽然在不了解情况的情况下很难说出来