mysql перемещает строку между таблицами

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

У меня есть строка в таблице1 и вы хотите переместить ее в таблицу2 и удалить ее из таблицы1. В принципе, вырезать + пасту.

Я использую 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

Используйте INSERT INTO … SELECT для вставки данных из другой таблицы

Просто сделайте это одной таблицей и сделайте поле флага, чтобы определить, умерена ли запись или нет.

Итак, единственное, что вам понадобится, это просто простой запрос на обновление.

Так все делается в целом.

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

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

Допустим, что таблица1 и таблица2 имеют эту структуру

| Идентификатор | 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 на основе кода, поэтому он использует свои функции и возвращает форматирование, но может помочь кому-то.

 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)); } 

(Bare-кости, проверка ошибок и т. Д.)

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

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

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

(Не перемещается внутри механизма 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; 

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

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

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

 $query = mysql_query(insert into table1) 

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

 mysql_query(insert into table2) 

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

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

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