以下两个address的外键定义是否相同?我的意思是他们是否最终得到了相同的有效database元素(索引,约束等)。我更喜欢后者,因为它是速记而不是输入。

这里明确地创建了地址索引和约束:

CREATE TABLE customer (
  customer_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  first_name VARCHAR(45) NOT NULL,
  last_name VARCHAR(45) NOT NULL,
  PRIMARY KEY  (customer_id),
  KEY idx_fk_address_id (address_id),
  CONSTRAINT fk_customer_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

约束和索引也是在这里创建的吗?

CREATE TABLE customer (
  customer_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  first_name VARCHAR(45) NOT NULL,
  last_name VARCHAR(45) NOT NULL,
  PRIMARY KEY  (customer_id),
  FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

还有其他差异需要注意吗?

分析解答

从功能的角度来看,这些声明是等效的。不同之处在于,第一个代码段设置了一个易于在以后维护的友好名称,第二个代码段将创建一些 auto-generated 名称。