php - MySQL переместить строку между таблицами




(5)

У меня есть 2 таблицы, table1 и table2.

У меня есть строка в table1 и хочу переместить его в table2 и удалить его из table1. В основном порез + паста.

Я использую php. Мой текущий план состоит в том, чтобы выбрать из таблицы 1, сохранить данные в php, вставить в таблицу 2, а затем удалить из таблицы 1. Это кажется очень долгим процессом.

Это действительно лучший способ сделать это?


Вам понадобится как минимум 2 запроса:

INSERT INTO table2 (column_name1, column_name2) SELECT column_name1, column_name2 FROM table 1 WHERE <insert_where_clause_here>

DELETE FROM table1 WHERE <your_where_clause>

Я не вижу более короткого способа сделать это с помощью MySQL


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

На командную кнопку, которая имеет функцию фиксации ваших данных в таблице 1

Использовать этот:

$query = mysql_query(insert into table1)

Вместо этого:

mysql_query(insert into table2)

И под запросом, который вставьте в таблицу 1, напишите:

$query2 = mysql_query(INSERT into TABLE2)
TRUNCATE TABLE TABLE2;

Это дает вам право выполнять два запроса по одному


Краткий ответ на вопрос, который задали, таков, как многие уже ответили, нет.

Но я чувствую, что вы ищете способ вставки в новую таблицу и удаления из старой за одну операцию. Для этого и нужны transactions .

Изменения не будут затронуты, пока транзакция не будет принята, что будет иметь тот же эффект, как если бы строки были фактически перемещены.

(Не перемещается внутри движка MySQL, но для пользователей / запросов)

Я хотел бы использовать INSERT SELECT и обернуть команды в транзакции что-то вроде этого:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN 
  ROLLBACK; 
  CALL ERROR_ROLLBACK_OCCURRED; 
END;

START TRANSACTION;
INSERT INTO table_new SELECT a,b,c FROM table_old WHERE x = 'something';
DELETE FROM table_old WHERE x = 'something';
COMMIT;

Мне пришлось решить ту же проблему, и это то, что я использовал в качестве решения.

Чтобы использовать это решение, исходная и целевая таблицы должны быть идентичны, и они должны иметь уникальный идентификатор и автоматическое увеличение в первой таблице (чтобы один и тот же идентификатор никогда не использовался повторно).

Допустим, у table1 и table2 такая структура

| Идентификатор | field1 | field2

Вы можете сделать эти два запроса:

INSERT INTO table2
SELECT *
FROM table1
WHERE <your_where_clause>

DELETE FROM table1 
WHERE table1.id in
(SELECT table2.id 
FROM table2)

Мне кажется, что это лучшее решение, чем предложенное Pieter888, потому что это решение не учитывает, что выбранные данные могут отличаться от удаленных данных (поскольку данные в таблице 1 могут изменяться между первым и вторым запросом), пока ты так в безопасности.


Я обнаружил, что мне нужно подготовить данные между начальным запросом и вставкой. Это было на CMS на основе codeigniter, поэтому он использует их функции и возвращает форматирование, но может кому-то помочь.

function move_row($id = 0) {
    /* first copy it from table_one to table_two */
    $query = $this->db->query('select * from table_one where id = ' . $id);
    $row = $query->row_array(); /* this appears to be required */
    $this->db->insert('table_two',$row);

    /* then delete it from table_one */
    return($this->db->query('delete from table_one where id = ' . $id));
}

(Голые, без ошибок и т. Д.)





mysql