Подтвердить что ты не робот

Mysql - перемещать строки из одной таблицы в другую

Если у меня две одинаковые по структуре таблицы, как я могу переместить набор строк из одной таблицы в другую?

Набор строк будет определен из запроса выбора.

например:

customer table

person_id | person_name | person_email
123         tom           [email protected]


persons table

person_id | person_name  | person_email

выборка выборки будет следующей:

select * from customer_table where person_name = 'tom';

Я хочу переместить строку из таблицы клиентов в таблицу

В идеале удаление данных из исходной таблицы, но это не будет прерывание транзакции.

4b9b3361

Ответ 1

Простой оператор INSERT INTO SELECT:

INSERT INTO persons_table select * from customer_table where person_name = 'tom';

DELETE FROM customer_table where person_name = 'tom';

Ответ 2

    INSERT INTO Persons_Table (person_id, person_name,person_email)
          SELECT person_id, customer_name, customer_email
          FROM customer_table
          WHERE "insert your where clause here";
    DELETE FROM customer_table
          WHERE "repeat your where clause here";

Ответ 3

Ответ Fabio действительно хорош, но требуется длительное время выполнения (как уже писал Trilarion)

У меня есть другое решение с более быстрым выполнением.

START TRANSACTION;
set @N := (now());
INSERT INTO table2 select * from table1 where ts < date_sub(@N,INTERVAL 32 DAY);
DELETE FROM table1 WHERE ts < date_sub(@N,INTERVAL 32 DAY);
COMMIT;

@N получает отметку времени в начале и используется для обеих команд. Все в транзакции, чтобы никто не беспокоился.

Ответ 4

INSERT INTO Persons_Table (person_id, person_name,person_email)
      SELECT person_id, customer_name, customer_email
      FROM customer_table
      ORDER BY `person_id` DESC LIMIT 0, 15 
      WHERE "insert your where clause here";
DELETE FROM customer_table
      WHERE "repeat your where clause here";

Вы также можете использовать ORDER BY, LIMIT и ASC/DESC для ограничения и выбора конкретного столбца, который вы хотите переместить.

Ответ 5

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

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

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

|id|field1|field2

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

INSERT INTO table2 SELECT * FROM table1 WHERE

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

Ответ 6

BEGIN;
INSERT INTO persons_table select * from customer_table where person_name = 'tom';
DELETE FROM customer_table where person_name = 'tom';
COMMIT;