Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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 SQL`update`如果行中存在键的组合-否则创建新行_Mysql_Sql - Fatal编程技术网

Mysql SQL`update`如果行中存在键的组合-否则创建新行

Mysql SQL`update`如果行中存在键的组合-否则创建新行,mysql,sql,Mysql,Sql,首先,我在这里和网上其他地方搜索过这个话题,找到了一些令人讨厌的文章和答案,但没有一篇是这样的 我有一个带有评级的表,您应该能够更新评级,但不能创建新行 我的表格包含:productId,评级,userId 如果存在具有productId和userId的行,则更新rating。否则创建新行 我该怎么做?您缺少一些信息或需要提供更多信息。程序必须执行SQL查询(SELECT语句)以确定表中是否包含具有给定productId和userId的行,然后执行UPDATE语句以更新评级,否则执行INSERT

首先,我在这里和网上其他地方搜索过这个话题,找到了一些令人讨厌的文章和答案,但没有一篇是这样的

我有一个带有评级的
,您应该能够更新评级,但不能创建新行

我的表格包含:
productId
评级
userId

如果存在具有
productId
userId
的行,则更新
rating
。否则创建新行


我该怎么做?

您缺少一些信息或需要提供更多信息。程序必须执行SQL查询(SELECT语句)以确定表中是否包含具有给定productId和userId的行,然后执行UPDATE语句以更新评级,否则执行INSERT以插入新行。除非您将这些步骤分组到存储过程中,否则它们是单独的步骤。

您缺少某些内容或需要提供更多信息。程序必须执行SQL查询(SELECT语句)以确定表中是否包含具有给定productId和userId的行,然后执行UPDATE语句以更新评级,否则执行INSERT以插入新行。除非将它们分组到存储过程中,否则这些步骤是单独的。

使用
替换为
查询

REPLACE INTO table (productId, userId, rating) VALUES ('product id', 'user id', 'rating');

REPLACE-INTO
与普通的insert类似,除非它在表中找到具有相同唯一键的行,它将在插入之前删除该行。

使用
REPLACE-INTO
查询

REPLACE INTO table (productId, userId, rating) VALUES ('product id', 'user id', 'rating');

REPLACE-INTO
与普通插入类似,除非它发现表中已有一行具有相同的唯一键,它将在插入前删除该行。

首先添加一个
唯一的约束:

ALTER TABLE tableX
  ADD CONSTRAINT productId_userId_UQ
    UNIQUE (productId, userId) ;
然后您可以使用
插入。。。在重复密钥更新时
构造:

INSERT INTO tableX
  (productId, userId, rating)
VALUES
  (101, 42, 5),
  (102, 42, 6),
  (103, 42, 0)
ON DUPLICATE KEY UPDATE
  rating = VALUES(rating) ;

请参见

首先添加一个
唯一的
约束:

ALTER TABLE tableX
  ADD CONSTRAINT productId_userId_UQ
    UNIQUE (productId, userId) ;
然后您可以使用
插入。。。在重复密钥更新时
构造:

INSERT INTO tableX
  (productId, userId, rating)
VALUES
  (101, 42, 5),
  (102, 42, 6),
  (103, 42, 0)
ON DUPLICATE KEY UPDATE
  rating = VALUES(rating) ;

查看关于重复密钥更新的

,您搜索过吗?是的,但它不是重复密钥。userId可以为其他productID评分,其他用户也可以为productID评分…两列可以一起作为主键,因此它将是一个重复键,在
(userId,productID)
上具有唯一(或主键)约束,重复密钥更新上的
构造将正常工作。重复密钥更新上的
的可能重复项
您搜索过吗?是的,但它不是重复密钥。userId可以为其他productID评分,其他用户也可以为productID评分…两列可以一起作为主键,因此它将是一个重复键,在
(userId,productID)
上具有唯一(或主键)约束,重复键更新上的
结构可以很好地工作。如何从PHP调用一次就完成这些单独步骤的可能重复?你能给我介绍一个例子或给我看一下吗?我如何通过一个PHP调用来完成这些单独的步骤?你能给我介绍一个例子吗?你的唯一密钥应该是产品id和用户id的组合密钥,在这种情况下,它也恰好是你的主键。当查询运行时,如果找到现有的产品id和用户id组合,它将删除该行,然后执行插入。
REPLACE
有几个缺点。请阅读:您的唯一密钥应该是product_id和user_id的组合密钥,在这种情况下,它也恰好是您的主键。当查询运行时,如果找到现有的产品id和用户id组合,它将删除该行,然后执行插入。
REPLACE
有几个缺点。阅读:这不允许我对一个以上的产品进行评级。。。它只更新第一个产品的评级…这不允许我对多个产品进行评级。。。它只更新第一个产品的评级。。。