MySQL: Як скопіювати рядки, але змінити кілька полів?


195

У мене є велика кількість рядків, які я хотів би скопіювати, але мені потрібно змінити одне поле.

Я можу вибрати рядки, які хочу скопіювати:

select * from Table where Event_ID = "120"

Тепер я хочу скопіювати всі ці рядки та створити нові рядки під час встановлення Event_IDна 155. Як я можу це досягти?

Відповіді:


279
INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"

Тут col2, ... представляють решта стовпців (тих, що не Event_ID) у вашій таблиці.


39
чи можна це зробити, не вказуючи назви стовпців?
Андрій

4
Не те, що мені відомо. Звичайно, якщо у вашій таблиці є близько 1000 стовпців або щось подібне, і ви не хочете вводити їх усі, тоді ви можете написати SQL-заяву, щоб створити свій SQL-оператор :) Так, як ви це зробили б, скористайтеся інформацією_schema для отримання назв стовпців для таблиці. Але це справді надмірно, я б просто набрав назви стовпців.
dcp

3
Чи можливо це за допомогою зірочки для отримання решти стовпців?
Пітер

2
Увійдіть, щоб подати заявку лише для того, щоб дізнатися, що це вже було зроблено. Напевно, це врятувало мене кілька разів :) Дякую!
aexl

2
@Bitterblue - Вибачте, я не розумію ваш коментар. Я ніколи не казав col2, ... це стовпці, які ви не хочете копіювати, я просто сказав, що вони представляють решту стовпців таблиці. Очевидно, що вони будуть скопійовані, інакше їх взагалі не було б у операторі SQL.
dcp

140

Це рішення, у якому у вашій таблиці багато полів, і ви не хочете отримувати судом пальця від введення всіх полів, просто введіть потрібні :)

Як скопіювати кілька рядків у ту саму таблицю, де деякі поля мають різні значення:

  1. Створіть тимчасову таблицю з усіма рядками, які ви хочете скопіювати
  2. Оновіть усі рядки у тимчасовій таблиці потрібними значеннями
  3. Якщо у вас є поле автоматичного збільшення, слід встановити його в NULL у тимчасовій таблиці
  4. Скопіюйте всі рядки тимчасової таблиці в оригінальну таблицю
  5. Видаліть тимчасову таблицю

Ваш код:

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";

UPDATE temporary_table SET Event_ID="120";

UPDATE temporary_table SET ID=NULL

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

Загальний код сценарію:

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

UPDATE temporary_table SET <auto_inc_field>=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

Спрощений / стиснутий код:

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

INSERT INTO original_table SELECT * FROM temporary_table;

Оскільки для створення тимчасової таблиці використовується TEMPORARYключове слово, воно буде автоматично відмінено, коли сеанс закінчиться (як @ ar34z запропонував).


7
MySQL підтримує TEMPORARYключове слово для створення тимчасових таблиць. Використання CREATE TEMPORARY TABLEбуде автоматично відкидати таблицю після завершення сеансу (серія запитів SQL). Видалення таблиці не буде необхідним, і це не суперечить іншим тимчасовим таблицям, використовуючи те саме ім'я. (наприклад, під час хакерської роботи (що я б не рекомендував))
ar34z

1
цей код працює лише якщо ви користуєтесь #temporary_table замість тимчасового_table, можливо, проблема MSSQL?
TruthOf42

16
Це в основному працювало для мене ідеально, але мені довелося подолати обмеження Not Null на первинному ключі в таблиці темп, яке, здається, скопійовано з оригінальної таблиці. Я виправив це, змінивши таблицю темп перед оновленням так: ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; Тоді оновлення первинного ключа до Null не відбудеться.
снорріс

1
Я не можу змусити його працювати в PostgreSQL 9.4: Exception: null value in column <auto_inc_not_null_field> violates not-null constraint. Я спробувавALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000

1
Я тестував різні версії MySQL та MariaDB. Для мене ідеально підходить, і я віддаю перевагу цій версії прийняту відповідь, що насправді трапляється тут досить часто :)
програмне забезпечення для

41

Скажімо, у вашому столі є ще два стовпці: foo та bar

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"

4
чи можна це зробити, не вказуючи назви стовпців?
Андрій

@PeterBailey Нове в MySQL, чи можете ви прояснити, як працює код: /
3kstc

10

Якщо у вашій таблиці є набір стовпців і ви не хочете вводити кожну, ви можете це зробити, використовуючи тимчасову таблицю, наприклад;

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

6
зауваження: це передбачає, що у вас немає основного ключа в таблиці
kommradHomer

2

Гей, як збиратись скопіювати всі поля, змінити одне з них на те саме значення + щось інше.

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"

??????????


0

Поки Event_ID є Цілим, зробіть це:

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.