2016-09-02 2 views
2

У меня есть скрипт, который всегда проверяет, существует или нет строка, в зависимости от настроек события.SQL - Проверка существующих данных

Например:

if(exists($row)){ 
    // update 
}else{ 
    // insert 
} 

Вставить запрос:

INSERT INTO table (name, value) VALUES 
    ('...', '1'), 
    ('...', '2'), 
    ('...', '3'), 
    ('...', '4'), 
    ('...', '5'), 
    //...100x 

UPDATE QUERY:

UPDATE table 
    SET value = CASE uuid 
     WHEN 'x' THEN 1 
     WHEN 'y' THEN 2 
    END, 
    SET value1 = CASE uuid 
     WHEN 'x' THEN 1 
     WHEN 'y' THEN 2 
    END 
    WHERE uuid IN ('x','y') 

данных довольно много, и убедитесь, что запись существует достаточно долго. Потому что выполняет необходимые 500 или более раз.

Exists метод:

SELECT id FROM table WHERE uuid=Y; 

Существует возможность как-то ускорить сценарий? Можно ли проверить существующие данные, добавленные непосредственно в запрос?

Можно ли задать только один запрос CREATE + UPDATE + CHECK SUISK?

Спасибо за помощь!

Updating and adding data with verification : 27-40 SEC 
Updating and adding data WITHOUT verification: 1-5 SEC 

EDIT: Я получаю данные с другого сервера, как JSON, например, сценарий:

$data = json_decode($_POST["data"]); 
foreach($data as value){ 
    // value is an array 
    if(exists($value["uuid"])){ 
     $this->appendUpdate($value); // building the update query 
    }else{ 
     $this->appendInsert($value); // building the insert query 
    } 
} 

    $this->insert(); // for example: 30 inserts in 1 query 
    $this->update(); // for example: 500 updates in 1 query 

В этой таблице только 300-2000 строк (я не понимаю, почему это занимает так много времени.)

EDIT2:

Это вероятно моего решения:

INSERT INTO test (uuid, value) VALUES 
    ('aaa', 1), 
    ('bbb', 2), 
    ('ccc', 3) 
    ON DUPLICATE KEY UPDATE 
    value = (
     IF(uuid='aaa', 4, IF(uuid='bbb', 5, IF(uuid='ccc', 6, value))) 
    ); 

Я собираюсь попытаться запустить оживленный сервер, а затем коснуться.

+0

грим вид таблицы с помощью выбора, а затем, если вы можете вставить. Принимаете ли вы данные вставки из самой базы данных или имеете локальные данные? – Motsim

+0

Вставить игнорировать ... на дубликаты обновления? – Jakumi

+0

вопрос был обновлен @Motsim –

ответ

2

Убедитесь, что столбец UUID имеет уникальный индекс, и вы можете сделать следующий запрос

INSERT INTO table (a,b) VALUES (1,2) 
    ON DUPLICATE KEY UPDATE b=4; 
+0

Я не могу использовать UUID в качестве первичного ключа, потому что первичный ключ является «ID» - UUID - это просто первичный ключ на другом сервере, а не мой. –

+0

Уникальный индекс - это нечто иное, чем первичный ключ. они довольно похожи, но вы можете иметь несколько уникальных индексов на таблицу, поэтому это не должно быть проблемой. – MarcHoH

+0

aaaaa hmmm, вероятно, он работает сейчас (на другой тестовой таблице). Я попытаюсь заставить его работать в реальном скрипте. @MarcHoH –

0

Что-то вроде этого:

INSERT INTO table(name,value) 
SELECT table2name as name, table2value as value FROM table2 
WHERE uuid IS NULL; 
Смежные вопросы