2015-12-20 7 views
2

У меня есть таблица mysql с именем company_profile. У него может быть только одна запись. Поэтому я попытался вставить и обновить данные таблицы с помощью запроса INSERT.... ON DUPLICATE KEY UPDATE.INSERT ... ON DUPLICATE KEY UPDATE issue

Это, как я попробовал:

$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' ->' ПЕРВИЧНЫЙ КЛЮЧ (id), UNIQUE KEY (id) '. Итак, какой столбец должен вызывать 'ON DUPLICATE KEY' – Sean

ответ

3

Во-первых, он является излишним для определения ключа как оба unique и primary 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)'. В примере Гордона он называет ограничение, но если вы выберете не слишком, имя будет автоматически сгенерировано. – noahnu

Смежные вопросы