使用InnoDB的MySQL语法
所以我接管了一个数据库,在理解这四行的确切含义时有点困难。我意识到这些行强制执行数据库的关系方面,但我希望准确地指出这种语法在做什么使用InnoDB的MySQL语法,mysql,sql,ddl,Mysql,Sql,Ddl,所以我接管了一个数据库,在理解这四行的确切含义时有点困难。我意识到这些行强制执行数据库的关系方面,但我希望准确地指出这种语法在做什么 键x(y): 它是什么?/位置与部门名称、类别名称和位置名称的关系是什么 约束 这似乎使owner与表users中的列username连接,但为什么需要约束部分(即约束位置的作用) 在删除时设置空值,在更新级联时设置空值 只需检查用户名被删除或更改时,是否反映了删除或更改 我应该对此代码段进行任何更改吗 KEY `location_sh` (`dep_name`,
键x(y)
:它是什么?/位置与部门名称、类别名称和位置名称的关系是什么李>
约束
这似乎使owner与表users中的列username连接,但为什么需要约束部分(即约束位置的作用)李>
在删除时设置空值,在更新级联时设置空值
只需检查用户名被删除或更改时,是否反映了删除或更改李>
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
Mysql页面上的这些项目: 1) 键定义用于表搜索的键。db引擎对键进行索引,以提供更快的查询结果 2) 约束为外键应用“规则”。这意味着这些键
dep_name、cat_name、loc_name
都指向位置
表中相同名称的列
3) 在提供的链接中很好地描述了删除操作
4) 看起来不错。。。尽管在不知道情况背景的情况下很难判断Mysql页面上的这些项目: 1) 键定义用于表搜索的键。db引擎对键进行索引,以提供更快的查询结果 2) 约束为外键应用“规则”。这意味着这些键
dep_name、cat_name、loc_name
都指向位置
表中相同名称的列
3) 在提供的链接中很好地描述了删除操作
4) 看起来不错。。。虽然在不知道情况背景的情况下很难判断这一点:
KEY `location_sh` (`dep_name`,`cat_name`,`loc_name`)
…定义了一个称为“位置”的覆盖索引。我指定了“覆盖索引”,因为索引声明包含多个列
KEY `owner_sh` (`owner`)
…不使用多个列,因此它只是一个KEY
是MySQL特有的索引语法——尽管ANSI目前没有涵盖,但每个数据库都实现了索引并使用了类似的术语(以某种方式)
其余的约束声明:
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
…是的。它们用于强制引用完整性——定义的列只能具有在语句的REFERENCES
部分中指定的表列中已经存在的值
关于删除时的。
-文档中说:
InnoDB对尝试更新或删除父表中的候选键值(子表中有一些匹配行)的任何更新或删除操作所采取的操作取决于使用FOREIGN key子句的on UPDATE和on DELETE子类指定的引用操作。当用户试图从父表中删除或更新行,并且子表中有一个或多个匹配行时,InnoDB支持五个有关要采取的操作的选项。如果未指定“删除时”或“更新时”,则默认操作为“限制”
你应该做什么改变?
除了语法(看起来是正确的)之外,我们没有上下文来说明什么是对的或错的。这完全取决于您的数据以及该数据的业务规则。这:
KEY `location_sh` (`dep_name`,`cat_name`,`loc_name`)
…定义了一个称为“位置”的覆盖索引。我指定了“覆盖索引”,因为索引声明包含多个列
KEY `owner_sh` (`owner`)
…不使用多个列,因此它只是一个KEY
是MySQL特有的索引语法——尽管ANSI目前没有涵盖,但每个数据库都实现了索引并使用了类似的术语(以某种方式)
其余的约束声明:
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
…是的。它们用于强制引用完整性——定义的列只能具有在语句的REFERENCES
部分中指定的表列中已经存在的值
关于删除时的。
-文档中说:
InnoDB对尝试更新或删除父表中的候选键值(子表中有一些匹配行)的任何更新或删除操作所采取的操作取决于使用FOREIGN key子句的on UPDATE和on DELETE子类指定的引用操作。当用户试图从父表中删除或更新行,并且子表中有一个或多个匹配行时,InnoDB支持五个有关要采取的操作的选项。如果未指定“删除时”或“更新时”,则默认操作为“限制”
你应该做什么改变?
除了语法(看起来是正确的)之外,我们没有上下文来说明什么是对的或错的。这完全取决于您的数据以及该数据的业务规则。+1。但我相信你指的是综合指数,而不是“覆盖”<代码>所有者\u sh也将涵盖
从表1
中选择所有者@a1ex07:“覆盖”是此类索引更常见的术语;“composite”通常用于谈论主键/等。两者都相当于一件事——土豆vs土豆。。。当你写这个笑话的时候,这个笑话并不管用:D:)我明白了,我习惯在特定查询的上下文中使用“覆盖”。我的坏消息:)+1。但我相信你指的是综合指数,而不是“覆盖”<代码>所有者\u sh也将涵盖从表1
中选择所有者@a1ex07:“覆盖”是此类索引更常见的术语;“composite”通常用于谈论主键/等。两者都相当于一件事——土豆vs土豆。。。当你写这个笑话的时候,这个笑话并不管用:D:)我明白了,我习惯在特定查询的上下文中使用“覆盖”。我的错:)