Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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
Php 这样的SQL查询存在吗?_Php_Mysql_Sql - Fatal编程技术网

Php 这样的SQL查询存在吗?

Php 这样的SQL查询存在吗?,php,mysql,sql,Php,Mysql,Sql,我在谷歌上发现了一些东西,上面说MySql允许我这样做: $sql = "IF(EXISTS(SELECT api_key, username FROM credentials WHERE id = 0)) THEN UPDATE credentials SET api_key = ?, username = ? WHERE id = 0 ELSE INSERT INTO credentials (api_key, username) VALUES (?, ?) END IF"

我在谷歌上发现了一些东西,上面说MySql允许我这样做:

$sql = "IF(EXISTS(SELECT api_key, username FROM credentials WHERE id = 0)) 
    THEN UPDATE credentials SET api_key = ?, username = ? WHERE id = 0 ELSE
    INSERT INTO credentials (api_key, username) VALUES (?, ?) END IF";
这是查询的一部分功能:

protected function store_credentials($config_file_path = 'envato_credentials_config.json') {
    $credentials_config = $this->get_envato_config($config_file_path);
    $sql = "INSERT INTO credentials (api_key, username, last_update) VALUES (?, ?, NOW()) ON DUPLICATE KEY UPDATE api_key = values(api_key), username = values(username), last_update = values(last_update)";
    if ($stmt = $this->connect->prepare($sql)) {
        $stmt->bind_param('ss', $credentials_config['API'], $credentials_config['User']);
        $stmt->execute();
        $stmt->close();
    } else {
        return false;
    }
}
我可以这样做吗?我是否清楚地理解了这句话,如果在这两列中找不到任何值,那么将插入新值,否则它只会更新?

您可以使用MySQL:

您可以使用MySQL的:


mysql的REPLACE语法实现了这一点。若记录存在,则更新它(实际上删除旧行并插入新行),否则插入


mysql的REPLACE语法实现了这一点。若记录存在,则更新它(实际上删除旧行并插入新行),否则插入



这通常被称为UPSERTI-see,因此从语法角度来看它是正确的,但它是最简单的吗?存在,但与您发布的不完全一样。请给出完整的问题这就是我为什么问的原因,以确保我没有做傻事:)无论如何,有一个答案比我添加的答案更能帮助我:)这通常被称为UPSERTI-see,因此,从语法的角度来看,它是正确的,但它是最简单的吗?存在,但与您发布的不完全一样。请给出完整的问题这就是我问的原因,以确保我没有做傻事:)无论如何,有一个答案比我添加的答案更能帮助我:)by
KEY
这里你是指主键吗?任何唯一的索引或主键都可以触发重复键上的
子句,所以这句话可以做我想做的事吗?我当然希望如此,否则我不会发布它;)但是测试是无可替代的。@Roland虽然我相信这并不能解决您的问题,但您不必更新update语句中的主键字段。你可以省略它。这里的
KEY
是指主键吗?任何唯一的索引或主键都可以触发重复键上的
子句,因此该语句可以满足我的要求?我当然希望如此,否则我就不会发布它;)但是测试是无可替代的。@Roland虽然我相信这并不能解决您的问题,但您不必更新update语句中的主键字段。你可以省略它。这应该可以,但要注意,这会删除它!对于删除级联外键上带有
的列,
replace
将导致引用表中的删除。这应该可以工作,但请注意,这确实会删除!对于删除级联
外键上带有
的列,
replace
将导致在引用表中删除
INSERT INTO credentials (api_key, username) VALUES (?, ?)
    ON DUPLICATE KEY UPDATE api_key = values(api_key), username = values(username);
13.2.7. REPLACE Syntax
REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
Or:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...
Or:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...
REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted. See Section 13.2.5, “INSERT Syntax”.

REPLACE is a MySQL extension to the SQL standard. It either inserts, or deletes and inserts. For another MySQL extension to standard SQL—that either inserts or updates—see Section 13.2.5.3, “INSERT ... ON DUPLICATE KEY UPDATE Syntax”.

Note that unless the table has a PRIMARY KEY or UNIQUE index, using a REPLACE statement makes no sense. It becomes equivalent to INSERT, because there is no index to be used to determine whether a new row duplicates another.

Values for all columns are taken from the values specified in the REPLACE statement. Any missing columns are set to their default values, just as happens for INSERT. You cannot refer to values from the current row and use them in the new row. If you use an assignment such as SET col_name = col_name + 1, the reference to the column name on the right hand side is treated as DEFAULT(col_name), so the assignment is equivalent to SET col_name = DEFAULT(col_name) + 1.

To use REPLACE, you must have both the INSERT and DELETE privileges for the table.