如果存在则更新一行,如果不存在则创建新行MySQL

7

我正在将姓名、号码和公司插入到数据库中。

我的表格非常简单:

id(primary key)
name
slideView
company

如果传递的名称存在,我需要更新此信息,否则使用这些数据创建新行。我已经查看了REPLACE INTO,但我认为那对我不起作用...因为我根本不接触ID。

我的代码是:

insertData($name,$count,$company);

function insertData($name, $count, $company) {

    #Try/Catch statement to connect to DB, and insert data
    try {
        #DB username/password   
        $usernameDB = '****';
        $passwordDB = '****';

        #Create new PHP Database Object with the address, username, and password as parameters
        $pdo = new PDO('mysql:host=localhost;dbname=*****', $usernameDB, $passwordDB);

        #Set pdo attributes to handle errors 
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        #assign the sth variable (sth means statement handle) to insert the data
        $sth = $pdo->prepare("REPLACE INTO ***** SET name = ?, slideView = ?, company = ?");

        #Execute the insert
        $sth->execute(array($name,$count,$company));

    #Error if can't connect or insert
    } catch(PDOException $e) {
        echo 'Error: ' . $e->getMessage();
    }#/try
}

我是SQL的新手,尚未找到一个好的方法来做到这一点。

2个回答

4
你最好使用insert ... on duplicate update语法来解决这个问题,虽然这意味着需要传递一些额外的参数,但它可以消除在replace into语法中不断出现的某些问题
REPLACE INTO ***** SET name = ?, slideView = ?, company = ?

可以写成:

insert into yourTableName (name, slideView, company)
    values (:name, :slideView, :company)
    on duplicate key update set
        slideView=:$slideView2, company=:company2

然后执行的方式如下:
$sth->execute(array(':name' => $name, ':slideView' => $count,
    ':company' => $company, ':slideView2' => $count, ':company2' => $company));

上述格式使用了命名参数(它们更易于阅读/调试),并将插入新行到数据库中-或者如果唯一/主键列"name"已经有该值,则使用其余信息更新该行。

您必须在这里两次使用参数(即使slideView和company包含相同的信息),因为查询中不能使用同一个参数两次。


这看起来是正确的。虽然它会抛出这个错误:Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET slideView=NULL, company=NULL' at line 1 - mdance
另外,我正在运行MySQL版本5.1.61 - mdance
我移除了“SET”语句后,查询成功执行,但是没有更新任何内容 - 每次只是不停地添加新行。 - mdance
@mdance,你的表中确实将name设置为唯一行了吗? - Fluffeh

2
REPLACE INTO 应该可以很好地工作 - 它还检查具有唯一约束的列。因此,您只需要将name标记为唯一,这样 REPLACE INTO 就会将其识别为重复项。

我没有尝试过这个特定的用例,但文档似乎允许它。


我选择回到最初的状态。一旦将我的姓名列标记为唯一,它就起作用了。谢谢! - mdance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接