mysql中作为主键的外键
我有两个相关的表mysql中作为主键的外键,mysql,sql,insert,foreign-keys,Mysql,Sql,Insert,Foreign Keys,我有两个相关的表 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)
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:在插入到帖子后,帖子元不接受带有错误的值键的重复条目XX“PRIMARY
。我应该如何修改表结构
问题2:如何设置在插入帖子时在post\u meta
中创建相应的行?我的意思是在posts
中创建行时,在post\u meta
中创建一个空行(只有FK的id)。换句话说,在两列中有相同数量的行,而在第二列中没有任何插入。您当前的实现看起来不规范。是否确实需要将数据分隔到两个不同的表中?也许吧
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\u id
主键(不要设置为外键!),并在表posts
上添加INSERT和DELETE触发器,这将插入或删除post\u meta中的相应行
更新
您在评论中说,您可以在post\u meta
表中有多条记录,对应于posts
中的单个记录。这改变了很多:
不能在表post\u meta
中的post\u id
上使用主键。主键在表范围中必须是唯一的李>
您可以设置外键(您已经尝试设置的外键)-这将确保元数据在发布时自动删除
如果您确实需要在post\u meta
上定义主键,那么您应该在post\u meta
表中添加一个新字段(可能是自动增量字段),并将其用作主键。(此外,即使没有主键,表也可以存在,但这违反了大多数DB准则)
如果您需要为每个帖子自动创建一个元记录,那么您可以在posts
上添加一个插入触发器,正如我已经建议的那样。另一种方法是使用存储过程(并且仅使用存储过程)将记录添加到posts
——在这个SP中,您可以编写一些SQL来将必要的记录插入post\u meta
您当前的实现看起来不符合规范化形式。是否确实需要将数据分隔到两个不同的表中?也许吧
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\u id
主键(不要设置为外键!),并在表posts
上添加INSERT和DELETE触发器,这将插入或删除post\u meta中的相应行
更新
您在评论中说,您可以在post\u meta
表中有多条记录,对应于posts
中的单个记录。这改变了很多:
不能在表post\u meta
中的post\u id
上使用主键。主键在表范围中必须是唯一的李>
您可以设置外键(您已经尝试设置的外键)-这将确保元数据在发布时自动删除
如果您确实需要在post\u meta
上定义主键,那么您应该在post\u meta
表中添加一个新字段(可能是自动增量字段),并将其用作主键。(此外,即使没有主键,表也可以存在,但这违反了大多数DB准则)
如果您需要为每个帖子自动创建一个元记录,那么您可以在posts
上添加一个插入触发器,正如我已经建议的那样。另一种方法是使用存储过程(并且仅使用存储过程)将记录添加到posts
——在这个SP中,您可以编写一些SQL来将必要的记录插入post\u meta
如果任何post\u meta
行有posts
行,为什么不在post\u meta
中设置post\u id
FK?问题2:如果任何post\u meta
行有posts
行,那么为什么不在post\u meta
中设置post\u id
FK?问题2:对于触发器,这只是一个简单的例子,元表包含单独的信息。例如,不同帖子类型的多个meta在需要时将与JOIN一起工作。这只是一个简单的例子,meta表包含单独的信息。例如,不同帖子类型的多个meta,在需要时可以使用JOIN。