ВСТАВЛІТЬСЯ У ВИБІР для всіх стовпців MySQL


119

Я намагаюся перемістити старі дані з:

this_table >> this_table_archive

копіювання всіх стовпців. Я спробував це, але це не працює:

INSERT INTO this_table_archive (*) VALUES (SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00');

Примітка: таблиці ідентичні та idвстановлені як первинний ключ.


1
Визначте "це не працює". У мене виникає якась подібна проблема, але я не можу сказати, тому що ви не сказали, у чому ваша проблема !!
Гонки легкості по орбіті

Він не зламаний, він просто не працює.
Вебмайстер G

Дивіться також тут /programming/3709560/joining-three-tables-using-mysql

Відповіді:


218

Правильний синтаксис описаний у посібнику . Спробуйте це:

INSERT INTO this_table_archive (col1, col2, ..., coln)
SELECT col1, col2, ..., coln
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00';

Якщо стовпці id - це стовпчик з автоматичним збільшенням, і ви вже маєте деякі дані в обох таблицях, то в деяких випадках ви можете опустити ідентифікатор зі списку стовпців і замість цього створити нові ідентифікатори, щоб не вставити ідентифікатор, який вже існує в оригіналі стіл. Якщо ваша цільова таблиця порожня, це не буде проблемою.


73

Для синтаксису він виглядає приблизно так (залиште список стовпців, щоб неявно означати «все»)

INSERT INTO this_table_archive
SELECT *
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00'

Щоб уникнути помилок первинного ключа, якщо у вас вже є дані в архівній таблиці

INSERT INTO this_table_archive
SELECT t.*
FROM this_table t
LEFT JOIN this_table_archive a on a.id=t.id
WHERE t.entry_date < '2011-01-01 00:00:00'
  AND a.id is null  # does not yet exist in archive

6
+1 для з’єднання зліва, щоб уникнути зіткнення первинного ключа.
Хартлі Броді

23

Додаток до відповіді Mark Byers:

Іноді ви також хочете вставити деталі з твердим кодом, інакше може виникнути неповторний збій обмежень і т. Д. Тому використовуйте наступне в такій ситуації, коли ви переосмислюєте деякі значення стовпців.

INSERT INTO matrimony_domain_details (domain, type, logo_path)
SELECT 'www.example.com', type, logo_path
FROM matrimony_domain_details
WHERE id = 367

Тут мені додається цінність домену жорстким способом позбутися від унікального обмеження.


4

вам не потрібен подвійний () для біта значень? якщо не спробувати це (хоча повинен бути кращий спосіб

insert into this_table_archive (id, field_1, field_2, field_3) 
values
((select id from this_table where entry_date < '2001-01-01'), 
((select field_1 from this_table where entry_date < '2001-01-01'), 
((select field_2 from this_table where entry_date < '2001-01-01'), 
((select field_3 from this_table where entry_date < '2001-01-01'));

2
ОП використовує INSERT INTO .. SELECT FROM, ні INSERT INTO .. VALUES. Різна особливість.
Гонки легкості по орбіті

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.