【问题标题】:using where clause in REPLACE statment在 REPLACE 语句中使用 where 子句
【发布时间】:2013-07-28 16:39:09
【问题描述】:

我在我的 PHP 脚本中使用了 where 子句,the SQL documentation doesnt states that either I can use where clause or not.(我认为在看到语法后我不能)

我的问题是我有一个存储用户注册的用户表, 现在我计划存储另一个关于用户的信息,即他们订阅了哪种类型的包。所以我在users table 中添加了另一列subscribed,但我意识到添加另一列可能会干扰以前的列,插入,选择我用 PHP 编写的查询。 所以我创建了另一个表,在这里将用户 ID 设为外键。package_id 作为 PK,pack_detail 作为关于包的详细信息。 现在我想存储特定用户的包详细信息,我希望如果用户以前存在他的行应该更新,我该如何通过替换来做到这一点?

【问题讨论】:

  • 为什么不先选择现有行然后更新?
  • 我知道,但我想通过替换来完成..
  • Replace 使用a PRIMARY KEY or a UNIQUE index 来确定何时插入或删除/插入。您可以使用表中的主键,也可以在 (user) 或 (user,package) 上创建唯一索引/键

标签: php sql where


【解决方案1】:

REPLACE 通过匹配主键来工作。如果您在 REPLACE 中指定主键值并且不存在具有该值的行,则它的工作方式类似于 INSERT。如果您尝试插入的主键值已存在于表中,则会覆盖该行的其他列。

所以不需要 WHERE 子句。它隐含地寻找WHERE pk = value

如果您希望它检测给定用户的包详细信息并且要使用 REPLACE,则必须将用户 ID 设为主键。

CREATE TABLE userpackages (
  userid INT PRIMARY KEY,
  package_detail TEXT,
  FOREIGN KEY (userid) REFERENCES users(userid)
);

首先我们添加用户的第一个包:

REPLACE INTO userpackages (userid, package_detail) 
VALUES (1234, 'some package');

接下来我们为用户 1234 更改包:

REPLACE INTO userpackages (userid, package_detail) 
VALUES (1234, 'some other package');

如果 userid 不是您的主键,那么 REPLACE 将不起作用。

【讨论】:

    猜你喜欢
    • 2018-09-26
    • 2021-03-14
    • 2011-09-19
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    相关资源
    最近更新 更多