查看下图。在movie_custom
表中,您会看到当我在plist_field
和movie_custom
之间添加1:m关系时,MySQL Workbench为plist_type
的附加表添加了密钥除了我期待的密钥之外还有plist_view_type
。
为什么?
可以/应该删除它们吗?
或者如果我应该保留它们,如何在插入movie_custom
时自动插入深层表中的键值,并且我知道plist_field
的键?
答案 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()
或其他程序逻辑。