INSERIRE con SELEZIONA


287

Ho una query che inserisce usando un select:

INSERT INTO courses (name, location, gid) 
            SELECT name, location, gid 
              FROM courses 
             WHERE cid = $cid

È possibile selezionare solo "nome, posizione" per l'inserimento e impostare gid su qualcos'altro nella query?

Risposte:


548

Sì, assolutamente, ma controlla la tua sintassi.

INSERT INTO courses (name, location, gid)
SELECT name, location, 1
FROM   courses
WHERE  cid = 2

Puoi mettere una costante dello stesso tipo gidal suo posto, non solo 1, ovviamente. E ho appena inventato il cidvalore.


2
Ha funzionato, grazie mille. Con Inserisci selezione, la parentesi non è richiesta attorno ai nomi dei campi. Ma quando inizi a specificare i valori sopra la selezione, apparentemente hai bisogno di () attorno ai nomi dei campi.
Kyle

Si noti che non è possibile utilizzare gli alias nella clausola insert: "INSERISCI I corsi t1 (t1.name, t1.location, t1.gid) non [...] falliranno.
raphael

@Andrew esiste un metodo per restituire questa stessa selezione senza eseguire la selezione la prossima volta? se voglio inserire e ottenere il risultato della tabella dei corsi
TAHA SULTAN TEMURI,

1
@TAHASULTANTEMURI Domanda diversa. Ma se capisco quello che mi stai chiedendo, SQL Server (non quello che mi è stato chiesto, ma quello che uso in questi giorni) ha la OUTPUTclausola , che ti consente di inserire anche ciò che hai inserito in un'altra tabella. Non penso che MySQL abbia un equivalente. È possibile creare una tabella temporanea , selezionare in quella tabella, quindi popolare coursesda quella tabella, quindi utilizzare la tabella temporanea per qualsiasi altra cosa necessaria.
Andrew,

31

Sì. Tu puoi scrivere :

INSERT INTO courses (name, location, gid) 
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci

oppure puoi ottenere valori da un altro join della selezione ...


INSERISCI NOME corsi, posizione, gid SELEZIONA nome, posizione, '$ this-> gid' DA corsi DOVE cid = $ cid - Ottengo l'errore: hai un errore nella sintassi SQL; controlla il manuale corrispondente alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'nome, posizione, gid SELEZIONA nome, posizione,' 22 'DA corsi DOVE cid = 23' alla riga 1
Kyle

Immagino che il tuo campo gid sia un numero intero quindi: '22' deve essere 22. Cambia '$ this-> gid' con $ this-> gid
Alex Reche Martinez il

22 e '22' non dovrebbero importare in sql, ma ho inserito una stringa nel caso in cui il campo sia simile a un identificatore univoco.
Dumitrescu Bogdan,

8

Sintassi corretta: selezionare l'ortografia era errata

INSERT INTO courses (name, location, gid)
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci 

5

Certo, cosa vuoi usare per il gid? un valore statico, PHP var, ...

Un valore statico di 1234 potrebbe essere come:

INSERT INTO courses (name, location, gid)
SELECT name, location, 1234
FROM courses
WHERE cid = $cid


1

Certo che puoi.

Una cosa va comunque nota: l' INSERT INTO SELECTistruzione copia i dati da una tabella e li inserisce in un'altra tabella E richiede che i tipi di dati nelle tabelle di origine e di destinazione corrispondano. Se i tipi di dati da dati colonne della tabella non corrisponde (vale a dire cercando di inserire VARCHARin INT, o TINYINTin INT), il server MySQL viene generato unSQL Error (1366) .

Perciò stai attento.

Ecco la sintassi del comando:

INSERT INTO table2 (column1, column2, column3)
SELECT column1, column2, column3 FROM table1
WHERE condition;

Nota a margine: esiste un modo per aggirare i diversi problemi di inserimento dei tipi di colonna usando il casting nel tuo SELECT, ad esempio:

SELECT CAST('qwerty' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

Questa conversione ( CAST()è sinonimo di CONVERT()) è molto utile se le tue tabelle hanno set di caratteri diversi nella stessa colonna della tabella (che può potenzialmente portare alla perdita di dati se non gestita correttamente).


-2

La sintassi giusta per la tua query è:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
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.