Использование REPLACE INTO в базе данных MySQL, когда 2 столбца должны совпадать для уникальной строки - PullRequest
0 голосов
/ 04 июля 2011

Я хочу иметь таблицу, которая содержит 3 поля, и обновить эту таблицу, используя REPLACE, чтобы перезаписывать строки, а не создавать новые, когда 2 поля соответствуют последующим добавлениям.

Другими словами, я хочу сделать что-то подобное для «таблицы», в которой есть строки «a», «b» и «c» -

ЗАМЕНИТЬ В НАСТРОЙКУ таблицы c = $ var_c ГДЕ a = $ var_b И b = $ var_b

Так что он проверит, есть ли строка, в которой совпадает AND b, и запишет c в новую строку, только если еще нет строки для обновления. (извините за изложение очевидного)

Вот что я сделал вместо использования REPLACE. Этот код достигает того, что мне нужно, но я уверен, что есть более эффективный способ сделать это. Спасибо

$query1 = "SELECT COUNT(*) FROM table WHERE a = $var_a AND b = $var_b";
$result = @mysql_query ($query1);
$num = mysql_fetch_row($result);
if($num[0] != 0) {
    $query = "UPDATE table SET c = $var_c WHERE a = $var_a AND b = $var_b";
}
else {
    $query = "INSERT INTO table VALUES ($var_a, $var_b, $var_c)";
}
$result = @mysql_query ($query);
if (!$result) {
    die('Invalid query: ' . mysql_error());
}   

Ответы [ 3 ]

3 голосов
/ 04 июля 2011

Я бы рекомендовал , а не , чтобы использовать REPLACE вообще; в общем, я предпочитаю INSERT INTO ... ON DUPLICATE KEY UPDATE. ЗАМЕНА означает УДАЛИТЬ, чем ВСТАВИТЬ. Это особенно опасно для ограничений внешнего ключа с предложением ON DELETE CASCADE. Предположим, у вас есть таблицы

CREATE TABLE parent(
 id TINYINT UNSIGNED NOT NULL,
 data VARCHAR(255) NOT NULL,
 PRIMARY KEY( id )
) Engine = InnoDB;
CREATE TABLE child(
 id TINYINT UNSIGNED NOT NULL,
 parent_id TINYINT UNSIGNED NOT NULL,
 PRIMARY KEY( id ),
 FOREIGN KEY( parent_id ) REFERENCES parent( id ) ON DELETE CASCADE
) Engine = InnoDB;

Запуск REPLACE в родительской таблице приведет к удалению всех записей ссылок из дочерней таблицы. Да, это в некоторой степени требуется, потому что вы сказали «НА УДАЛЕННОМ КАСКАДЕ». Тем не менее, вы должны помнить, что ЗАМЕНА может быть опасной. С другой стороны, «УДАЛИТЬ НЕТ ДЕЙСТВИЙ» будет означать, что ваш ЗАМЕНА потерпит неудачу, по какой-то разумной причине. В конце концов - IMO - нет смысла удалять и вставлять одну и ту же запись, обычно INSERT INTO ... ON DUPLICATE KEY UPDATE - это то, что вам действительно нужно и нужно.

1 голос
/ 04 июля 2011
IF EXISTS(SELECT 1 FROM Mytable WHERE a = v1 AND b = v2)
BEGIN
    UPDATE Mytable SET c = v3
    WHERE a = v1 AND b = v2;
END
ELSE
BEGIN
      INSERT INTO Mytable(a,b,c)
      VALUES (v1,v2,v3)
END IF
0 голосов
/ 04 июля 2011

Если у вас на столе 2 клавиши на a и b, вы можете использовать это:

 $query = "INSERT INTO table VALUES ($var_a, $var_b, $var_c) 
           ON DUPLICATE KEY UPDATE c = $var_c ";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...