INSERISCI IN… SELEZIONA per tutte le colonne MySQL


119

Sto cercando di spostare i vecchi dati da:

this_table >> this_table_archive

copiando tutte le colonne. L'ho provato, ma non funziona:

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

Nota: le tabelle sono identiche e sono idimpostate come chiave primaria.


1
Definisci "non funziona". Sto avendo quello che potrebbe essere un problema simile ma non posso dirlo perché non hai detto quale fosse il tuo problema !!
Gare di leggerezza in orbita il

Non è rotto, semplicemente non funziona.
Webmaster G

Risposte:


218

La sintassi corretta è descritta nel manuale . Prova questo:

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

Se la colonna id è una colonna a incremento automatico e hai già alcuni dati in entrambe le tabelle, in alcuni casi potresti voler omettere l'id dalla lista delle colonne e generare nuovi id invece per evitare di inserire un id che esiste già nell'originale tavolo. Se la tua tabella di destinazione è vuota, questo non sarà un problema.


73

Per la sintassi, assomiglia a questo (tralascia l'elenco delle colonne per indicare implicitamente "tutto")

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

Per evitare errori di chiave primaria se si dispone già di dati nella tabella di archivio

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 per il join sinistro per evitare conflitti di chiavi primarie.
Hartley Brody

23

Aggiunta alla risposta di Mark Byers:

A volte si desidera anche inserire dettagli hardcoded, altrimenti potrebbe esserci un errore del vincolo Unique, ecc. Quindi utilizzare following in una situazione in cui si sovrascrivono alcuni valori delle colonne.

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

Qui il valore del dominio viene aggiunto da me in modo Hardcoded per sbarazzarmi del vincolo Unique.


4

non hai bisogno di double () per i valori bit? se non provate questo (anche se ci deve essere un modo migliore

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
L'OP sta usando INSERT INTO .. SELECT FROM, no INSERT INTO .. VALUES. Caratteristica diversa.
Gare di leggerezza in orbita il

0

Altri esempi e dettagli

    INSERT INTO vendors (
     name, 
     phone, 
     addressLine1,
     addressLine2,
     city,
     state,
     postalCode,
     country,
     customer_id
 )
 SELECT 
     name,
     phone,
     addressLine1,
     addressLine2,
     city,
     state ,
     postalCode,
     country,
     customer_id
 FROM 
     customers;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.