2015-07-22 3 views
0

Мне нужно создать новую таблицу с определенными данными из другой таблицы, но обновить исходную таблицу с идентификатором вновь вставленной записи из новой таблицы. Как так:Перемещение записей в новую таблицу, обновляющую исходный идентификатор соответственно

NEW_TABLE 
---------------- 
id 
-- other data -- 


ORIGINAL_TABLE 
---------------- 
id 
new_table_id 
-- other data -- 

Однако добавленные записи в new_table будут группироваться, чтобы избавиться от дубликатов. Таким образом, это не будет вставка 1 к 1. Запрос должен обновлять соответствующие записи, а не только скопированную запись.

Могу ли я сделать это в одном запросе? Я попытался сделать отдельный UPDATE на original_table, но он не работает.

Любые предложения?

+0

Вы используете PDO или mysqli? Я уверен, что любой способ можно сделать, просто не уверен, какой синтаксис поможет вам больше. –

+1

Попробуйте сделать это, используя временные таблицы в SQL. Для этого вам не нужен PHP. – Inceddy

+0

Брайан - я использую PDO – jerauf

ответ

0

Вы можете использовать temporary tables или создать view для NEW_TABLE.

Временные таблицы

Вы можете использовать ключевое слово TEMPORARY при создании таблицы. Таблица TEMPORARY видна только для текущего сеанса и автоматически отбрасывается при закрытии сеанса. Это означает, что два разных сеанса могут использовать одно и то же имя временной таблицы, не конфликтуя друг с другом или с существующей таблицей без тегов с тем же именем. (Существующая таблица скрыта до тех пор, пока временная таблица не будет удалена.) Чтобы создать временные таблицы, вы должны иметь привилегию CREATE TEMPORARY TABLES.

--Temporary Table 
create temporary table NEW_TABLE as (select * from ORIGINAL_TABLE group by id); 

Просмотров

Просмотров (включая обновляемых просмотров) доступны в MySQL Server 5.0. Представления представляют собой хранимые запросы, которые при вызове создают набор результатов. Представление действует как виртуальная таблица. Представления доступны в бинарных версиях от 5.0.1 и выше.

--View 
create view NEW_TABLE as select * from ORIGINAL_TABLE group by id; 

мнение всегда будет обновляться со значениями в ORIGINAL_TABLE и вам не придется беспокоиться о том, дублирующую информацию в базе данных.

Если вы не хотите использовать представление, я считаю, что вы можете выполнять только вставку на одну таблицу за раз, если у вас нет какого-то вида, который бы позволил вам обоим, но вы, вероятно, захотите это сделать как два шага в транзакции

Сначала вы должны сообщить базе данных, что хотите, start a transaction. Затем вы выполните свои операции и проверьте, были ли они успешными. Вы можете получить id of last inserted row (это предполагает, что у вас есть поле auto_increment) для использования во втором выражении. Если оба оператора, похоже, работают нормально, вы можете изменить commit, или, если нет, rollback изменений.

Пример:

//Assume it will be okay 
$success = true; 

//Start the transaction (assuming you have a database handle) 
$dbh->beginTransaction(); 

//First Query 
$stmt = "Insert into ...."; 
$sth = $dbh->prepare($stmt); 
//See if it works 
if (!$sth->execute()) 
    $success = false; 

$last_id = $dbh->lastInsertId(); 

//Second Query 
$stmt = "Insert into .... (:ID ....)"; 
$sth = $dbh->prepare($stmt); 
$sth->bindValue(":ID", $last_id); 
//See if it works 
if (!$sth->execute()) 
    $success = false; 

//If all is good, commit, otherwise, rollback 
if ($success) 
    $dbh->commit(); 
else 
    $dbh->rollBack(); 
0

Вы собираетесь делать 3 отдельно запросов, как я это вижу.

$db = new PDO("..."); 
$stmt = $db->prepare("SELECT * FROM table"); 
$stmt->execute(); 
$results = $stmt->fetchAll();just iterate o 

foreach ($results as $result) { 
    $stmt = "INSERT INTO new_table (...) VALUES (...)"; 
    $stmt = $pdo->prepare($stmt); 
    $data = $stmt->execute(); 

    $insert_id = $pdo->lastInsertId(); 

    // Update first table 
    $stmt = "UPDATE table SET id=:last WHERE id=:id"; 
    $stmt = $pdo->prepare($stmt); 
    $data = $stmt->execute(array('last' => $insert_id, 'id' => $result['id'])); 
} 

Вышеприведенный глобальный пример вашего рабочего процесса.

+0

Почему вы используете 'prepare()' в цикле foreach? –

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