【问题标题】:What is the difference between these two SQL queries?这两个 SQL 查询有什么区别?
【发布时间】:2011-10-27 20:18:34
【问题描述】:

我已经用这个 SQL 查询创建了表地址:

CREATE TABLE `address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Street` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Number` smallint(6) DEFAULT NULL,
  `other_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

但也有这样的查询:

CREATE TABLE `address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Street` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Number` smallint(6) DEFAULT NULL,
  `other_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `other_id` (`other_id`),
  CONSTRAINT `adress_ibfk_1` FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$

而且展位查询似乎创建了相同的表。

那么谁能给我解释一下这条线是做什么的:

KEY `other_id` (`other_id`),

这两行有什么区别:

  FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
and
  CONSTRAINT `adress_ibfk_1` FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

如果最后两行之间的区别是后者将名称'adress_ibfk_1'赋予外键?如果这是真的 - 我应该这样做吗?我的意思是,我为什么要命名外键?我需要他们的名字吗?

谢谢! :)

【问题讨论】:

  • 如果您不修正表名以正确拼写地址,您项目中的所有开发人员将永远讨厌您。
  • @HLGEM:哦,我还以为是存放一件女性派对服装的地方。
  • @HLGEM - 除非表名是瑞典语:)。但是由于字段名称不是瑞典语,所以您可能是正确的。
  • 您认为您将在 MASSIVE UNSIGNED BIGINT 中存储多少地址?您的其他数据类型也需要解决!

标签: mysql sql foreign-keys relational-database


【解决方案1】:

MySQL 将KEY 解释为索引,因此第二个查询在other_id 列上创建索引。

两个FK声明的区别在于你在第二行手动设置了名字。在第一行,MySQL 自动设置了一个名称。
他们确实需要名字,但你不一定要知道他们。一些更高级的 RDBMS 使用它们在查询引发错误时更加明确。

【讨论】:

  • 谢谢!!但第一个查询也会在 other_id 列上创建索引。即使我没有指定它也会被创建,就像 FK 得到它的名字一样?
  • xx77aBs :我不确定,但 MySQL 很可能会自动在 FK 列上创建索引。
  • 所以这不是规则?我的意思是,可能存在不会自动在 FK 列上创建索引的 RDBMS?
【解决方案2】:

KEYINDEX 的同义词,因此在 other_id 列上创建索引。

外键构造的唯一区别是后者constraint 版本允许您命名约束,而前者将被赋予系统生成的名称。

这个名字可以在INFORMATION_SCHEMA TABLE_CONSTRAINTS 表中看到。

【讨论】:

    猜你喜欢
    • 2012-04-19
    • 2014-02-08
    • 2010-12-19
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多