为什么MySQL Workbench在创建表之间的关系时会自动创建多个键?

时间:2016-07-08 20:17:51

标签: mysql sql database-design relational-database schema

查看下图。在movie_custom表中,您会看到当我在plist_fieldmovie_custom之间添加1:m关系时,MySQL Workbench为plist_type的附加表添加了密钥除了我期待的密钥之外还有plist_view_type

为什么?

可以/应该删除它们吗?

或者如果我应该保留它们,如何在插入movie_custom时自动插入深层表中的键值,并且我知道plist_field的键?

enter image description here

1 个答案:

答案 0 :(得分:1)

如果我们执行此架构创建:

create table parent
(   pid int auto_increment primary key,
    theirName varchar(100) not null
);

drop table if exists child;
create table child
(   cid int auto_increment primary key,
    theirName varchar(100) not null,
    pid int not null,
    foreign key `fk_c2p` (pid) references parent(pid)
);

检查孩子的遭遇:

mysql> show create table child \G;
CREATE TABLE `child` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `theirName` varchar(100) NOT NULL,
  `pid` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `fk_c2p` (`pid`), -- ******************** AUTO created by mysql
  CONSTRAINT `child_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `parent` (`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

从手册页Using FOREIGN KEY Constraints

  

... index_name 表示外键ID。 index_name 的值是   如果孩子已经有明确定义的索引,则忽略   可以支持外键的表。否则,MySQL含蓄   创建一个根据以下命名的外键索引   规则:

     
    

如果已定义,则使用CONSTRAINT 符号值。否则,     使用FOREIGN KEY index_name 值。

         

如果既未定义CONSTRAINT 符号或FOREIGN KEY index_name ,     使用的名称生成外键索引名称     引用外键列。

  

所以,回到你的问题。

一个。他们为什么创造?它们是因为mysql按照上面的指定创建它们而创建的。它们有助于快速反转查找。当要删除父行时,强制对子项进行快速非表扫描以允许或禁止删除父行。自动生成的密钥(或已经满足它的密钥)用于此目的。

B中。你应该删除它们吗?不,为什么不呢?阅读A.

℃。如何“从深层表中自动插入键值”:提前获取父级的ID(层次结构中的任何位置),例如使用LAST_INSERT_ID()或其他程序逻辑。