使用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:)我明白了,我习惯在特定查询的上下文中使用“覆盖”。我的错:)