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

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

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

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

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

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

4b9b3361

Ответ 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

Ответ 2

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

Ответ 3

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

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

То, как все это делается вообще.

Ответ 4

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

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

Предположим, что таблица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 могут меняться между первым и вторым запрос), в то время как вы в безопасности.

Ответ 5

Я обнаружил, что мне пришлось подготовить данные между исходным запросом и вставкой. Это было на основе 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-bones, проверка ошибок и т.д.)

Ответ 6

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

Но то, что я чувствую, вы ищете, это способ вставить в новую таблицу и удалить из старого за одну операцию. Это то, что для 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;

Ответ 7

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

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

Используйте это:

$query = mysql_query(insert into table1)

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

mysql_query(insert into table2)

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

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

Он дает вам привилегии для выполнения двух запросов по одному за раз