[英]Foreign key as primary key in mysql
我有两个依赖表
CREATE TABLE posts
(
post_id int(11) unsigned NOT NULL AUTO_INCREMENT,
title varchar(255),
PRIMARY KEY(post_id)
) ENGINE=InnoDB
CREATE TABLE post_meta
(
post_id int(11) unsigned REFERENCES posts(post_id) ON DELETE CASCADE,
info varchar(255),
PRIMARY KEY(post_id)
) ENGINE=InnoDB
问题1:在INSERT
输入posts
, post_meta
不接受带有错误Duplicate entry XX for key 'PRIMARY
值。 我应该如何修改表结构?
问题2:如何设置在INSERT INTO posts
在post_meta
创建相应的行? 我的意思是创建一个空行(仅适用于具有FK的ID) post_meta
创建行时posts
。 换句话说,两列中的行数相同,而第二列中没有任何INSERT
。
您当前的实现看起来不符合规范化格式。 您确定需要将数据分隔到两个不同的表中吗? 也许
CREATE TABLE posts
(
post_id int(11) unsigned NOT NULL AUTO_INCREMENT,
title varchar(255),
info varchar(255),
PRIMARY KEY(post_id)
) ENGINE=InnoDB
会做?
推测:如果由于安全问题而这样做,那么MySQL 支持列级特权 。
如果您正常化的数据因为某些原因,那么你可以只让不可接受post_id
主键两个表中(不让它外键!),并在表中添加INSERT和DELETE触发器posts
,这将插入或删除post_meta相应的行。
更新
您在评论中说,您可以在post_meta
表中具有多个记录,这些记录对应于posts
单个记录。 那变化很大 :
post_meta
在表post_meta
post_id
上使用主键。 主键在表范围内必须唯一。 post_meta
定义的PRIMARY KEY, post_meta
在post_meta
表中添加一个新的(可能是auto_increment字段)并将其用作主键。 (此外,即使没有主键,表也可以存在,但这违反了大多数数据库准则) posts
上添加一个INSERT触发器。 另一种方法是使用添加记录到存储过程(而且只有存储过程) posts
-在此SP你可以写一些SQL插入必要记录post_meta
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.