2015-12-20 123 views
2

我有一个名为company_profile的mysql表。它可能只有一个记录。所以我尝试使用INSERT.... ON DUPLICATE KEY UPDATE查询来插入和更新表格的数据。INSERT ...在重复密钥更新问题

这是我试了一下:

$sql = "INSERT INTO company_profile ( 
         company_name 
        , tel 
        , mobile 
        , fax 
        , email 
       ) VALUES (?, ?, ?, ?, ?) 
       ON DUPLICATE KEY UPDATE 
         company_name= VALUES(company_name) 
        , tel   = VALUES(tel) 
        , mobile  = VALUES(mobile) 
        , fax   = VALUES(fax) 
        , email  = VALUES(email)";     

$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('sssss', $company_name 
         , $telephone 
         , $mobile 
         , $fax 
         , $email 
         ); 
$stmt->execute(); 

我的问题是,当我更新数据,它总是插入新记录到我的表。

有人可以告诉我这是什么问题吗?

我的表结构是这样的:

CREATE TABLE IF NOT EXISTS company_profile (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    company_name VARCHAR(120) NOT NULL, 
    tel VARCHAR(20) NOT NULL, 
    mobile VARCHAR(20) NOT NULL,  
    fax VARCHAR(20) DEFAULT NULL, 
    email VARCHAR(60) NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY (id) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
+0

Mysql如何知道您插入的值不是重复的?你的主键是'id',你没有把它传递给你的查询。 –

+0

唯一的唯一键是'id' - >'PRIMARY KEY(id),UNIQUE KEY(id)'。那么哪一列应该调用'ON DUPLICATE KEY' – Sean

回答

3

首先,它是多余的定义键既是uniqueprimary key。只需将id定义为主键。

然后,您需要在用于复制的列上有一个唯一的约束/索引(这两个在功能上等同于此目的)。我猜测唯一性基于公司名称:

create unique index unq_company_profile_company_name on company_profile(company_name); 
+0

谢谢你的回答。有一个问题,我们可以在create table中定义这个唯一的约束/索引吗? – user3733831

+2

是的。查看['CREATE TABLE'](http://dev.mysql.com/doc/refman/5.7/en/create-table.html)语法的文档。你的表结构中已经有'UNIQUE KEY(columns ...)'。只需将'UNIQUE KEY(id)'改为'UNIQUE KEY(company_name)'。在Gordon的例子中,他命名约束条件,但如果您不选择,则会自动生成一个名称。 – noahnu