繁体   English   中英

外键作为mysql中的主键

[英]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输入postspost_meta不接受带有错误Duplicate entry XX for key 'PRIMARY值。 我应该如何修改表结构?

问题2:如何设置在INSERT INTO postspost_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单个记录。 那变化很大

  1. post_meta在表post_meta post_id上使用主键。 主键在表范围内必须唯一。
  2. 您可以设置外键(您已经尝试过的外键)-这样可以确保元数据随帖子自动删除。
  3. 如果确实需要在post_meta定义的PRIMARY KEY, post_metapost_meta表中添加一个新的(可能是auto_increment字段)并将其用作主键。 (此外,即使没有主键,表也可以存在,但这违反了大多数数据库准则)
  4. 如果您需要为每个帖子自动创建一个元记录,那么可以按照我的建议在posts上添加一个INSERT触发器。 另一种方法是使用添加记录到存储过程(而且只有存储过程) posts -在此SP你可以写一些SQL插入必要记录post_meta

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM