Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL/PHP-避免重复-(插入、唯一、替换)_Php_Mysql_Replace_Unique_Profile - Fatal编程技术网

MySQL/PHP-避免重复-(插入、唯一、替换)

MySQL/PHP-避免重复-(插入、唯一、替换),php,mysql,replace,unique,profile,Php,Mysql,Replace,Unique,Profile,我一直在自己的/小型社交媒体平台上工作,除了以下问题外,我几乎完成了工作: 我有我所有用户的配置文件,其中一个用户可以对其他人的配置文件发表评论。因此,有一个用户表如下所示: id |姓名|名字|| 以及一个用于向/从中添加/检索注释的表: id |作者id |接收者id |评论| 除了一个小问题外,所有这些都很有效:我想确保每个用户只能对任何个人资料发表一次评论。之后,他们将覆盖他们以前的评论。这意味着在将注释插入数据库之前,我必须检查相同的“author\u id”和“receiver\u

我一直在自己的/小型社交媒体平台上工作,除了以下问题外,我几乎完成了工作:

我有我所有用户的配置文件,其中一个用户可以对其他人的配置文件发表评论。因此,有一个用户表如下所示:

id |姓名|名字||

以及一个用于向/从中添加/检索注释的表:

id |作者id |接收者id |评论|

除了一个小问题外,所有这些都很有效:我想确保每个用户只能对任何个人资料发表一次评论。之后,他们将覆盖他们以前的评论。这意味着在将注释插入数据库之前,我必须检查相同的“author\u id”和“receiver\u id”组合

研究这一点,我发现有一些“独特”的键,你可以在其中组合这两个列,但我不确定如何实现它来解决我目前的问题,甚至不确定这是否是最好的方法

示例(用户):

多伊,约翰

多伊,简

示例(注释):

1,1,2,“嗨,我很好!”(约翰评论简)

2,2,1,“怎么了?”(简评论约翰)

示例(插入):

三十、 1,2,“Nevermind”(John再次评论/更改其评论并替换#1)

新结果(评论):

1,1,2,“无需担心”(约翰的新评论)

2,2,1,“怎么了?”(Jane的评论保持不变)

如果你能帮我,那太好了


向您致意,Martin首先您添加了唯一的密钥:

 ALTER TABLE comment ADD UNIQUE( author_id, receiver_id);
然后可以使用以下查询插入或更新:

INSERT INTO comment (author_id,receiver_id ,comment ) VALUES (1,2,"Nevermind") ON DUPLICATE KEY UPDATE comment = VALUES(comment)

有关更多信息,请参见此处:

您可以使用唯一键和REPLACE语句来执行此操作

这种表格的一个例子是:

CREATE TABLE profile_comment (
    id INT NOT NULL AUTO_INCREMENT,
    author_id INT NOT NULL DEFAULT 0,
    receiver_id INT NOT NULL DEFAULT 0,
    comment TEXT NOT NULL,

    PRIMARY KEY id,

    UNIQUE (author_id,receiver_id)

) [...character set and collation...];
然后,使用如下语句插入或更新表:

REPLACE INTO profile_comment(author_id,receiver_id,comment)
VALUES (<n>,<n>,<text>);
替换为配置文件注释(作者id、接收者id、注释)
值(,);
资料来源:


请注意,您必须避免为REPLACE语句提供id参数,因为主键和唯一键都可能导致在该场景中删除记录。

我认为这是最好的解决方案。旁注:您可以尝试使一些php代码混乱,以避免重复注释,但它当然应该在数据库层进行优化。在这种情况下,您的数据库是稳定的,将来可能连接到您的数据库的其他应用程序不会弄乱任何东西。如果需要,最好的做法是在自动清理/自动更新数据库表的重复键上使用。也许这张纸条会对某人有所帮助+从我这里得到1。