我对数据库,数据库架构和MySQL一般都比较陌生,所以如果我的方法不是最优的,请原谅我。我创建了一个名为comments
的表,我希望将用户id
存储到列post_id
中,该列可以正常工作。此表的唯一目的是存储在任何给定用户配置文件上发布的消息以及一些其他相关信息。
但是我想允许重复的条目,以便我可以阅读comments
表并查找某个用户id
,然后从comments
表中取出comments
列并将其显示在id
匹配的用户个人资料中。
我是通过在INNER JOIN
和comments
上user_info
执行此操作,特别是来自post_id
的{{1}}和comments
来自id
{1}}。
从用户个人资料中将信息发布到数据库时,我收到以下错误
user_info
USER_INFO
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '59' for key 'post_id'
评论
'user_info', 'CREATE TABLE `user_info` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `username` varchar(12) COLLATE utf8_unicode_ci NOT NULL,\n `pass` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,\n `joined` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (`id`),\n UNIQUE KEY `username` (`username`)\n) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'
如果我错过任何可能有助于您回答问题的内容,请告诉我。
答案 0 :(得分:1)
您需要在post_id上删除唯一索引:
ALTER TABLE `comments` DROP INDEX post_id;
然后,您可以根据需要创建非唯一索引:
ALTER TABLE `comments` ADD INDEX `post_id` (`post_id`);
此外,您的comments
表缺少主键。创建一个自动增量整数列:comment_id,用于标识记录。
答案 1 :(得分:0)
post_id应该是一个自动增量字段,作为唯一标识元组(行)的列表中的主键。您应该添加另一个名为user_id的列,该列存储来自user_info表的id。然后,您应该在注释表中向user_id列添加索引,以便更快地搜索。
答案 2 :(得分:0)
您需要三个表:用户,评论和评论列表。
users表只保存用户详细信息。评论表只保留评论。评论列表有3列:您不会真正使用的ID,用户ID和评论ID。
然后,您可以在评论列表表格中拥有多个用户ID条目,这些条目都与个人评论ID相关。
答案 3 :(得分:0)
您必须再次检查您的查询。因为您的选择查询可能会出现此问题。您必须从comments表的post_id列中删除唯一索引。
答案 4 :(得分:0)
如果comment
中的某一行与user_info
中的一行相关,而一个user_info
可以为零,一个或多个comment
,{{1只与一个comment
...
然后,您将user_info
列中的id
列(PRIMARY KEY)列的值存储为user_info
表中的值。
使用InnoDB引擎,您还可以定义FOREIGN KEY约束。
例如:
comment
将当前ALTER TABLE `comment` ADD
`user_info_id` INT COMMENT 'FK ref user_info.id' ;
ALTER TABLE `comment` ADD
CONSTRAINT `FK_comment_user_info` FOREIGN KEY (`user_info_id`)
REFERENCES `user_info` (`id`)
ON UPDATE CASCADE
ON DELETE CASCADE
列作为唯一键(或将其更改为PRIMARY KEY)保留在表格上。
请注意,当给定user_info
有多个注释时,JOIN操作将返回多行post_id
如果 FROM `user_info` u
LEFT
JOIN FROM `comment` c
ON c.user_info_id = u.id
WHERE u.id = 42
可以与多个comment
相关联,那么这将是多对多关系,而实现该规范的规范模式将是添加第三个关联表,关联表中的一行将具有对user_info
表和user_info
表的外键引用。