MASUKKAN dengan SELECT

287

Saya memiliki kueri yang menyisipkan menggunakan pilih:

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

Apakah mungkin untuk hanya memilih "nama, lokasi" untuk memasukkan, dan mengatur gid ke sesuatu yang lain dalam kueri?

Kyle
sumber

Jawaban:

547

Ya, tentu saja, tetapi periksa sintaks Anda.

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

Anda dapat menempatkan konstanta dengan tipe yang sama seperti giddi tempatnya, tentu saja tidak hanya 1. Dan, saya baru saja membuat cidnilainya.

Andrew
sumber
2
Bekerja, terima kasih banyak. Dengan Sisipkan Pilih, tanda kurung tidak diperlukan di sekitar nama bidang. Tetapi ketika Anda mulai menentukan nilai di atas pilih, tampaknya Anda perlu () di sekitar nama bidang.
Kyle
Perhatikan bahwa Anda tidak dapat menggunakan alias dalam klausa sisipan: "INSERT INTO courses t1 (t1.name, t1.location, t1.gid) [...] akan gagal.
raphael
@ Andrew apakah ada metode untuk mengembalikan pilih yang sama ini tanpa menjalankan pilih lain kali? jika saya ingin memasukkan dan mendapatkan hasil dari tabel kursus
TAHA SULTAN TEMURI
1
@TAHASULTANTEMURI Pertanyaan berbeda. Tetapi jika saya mengerti apa yang Anda minta, SQL Server (bukan apa yang diminta, tetapi apa yang saya gunakan hari ini) memiliki OUTPUTklausa , yang memungkinkan Anda memasukkan apa pun yang Anda masukkan ke dalam tabel lain juga. Saya tidak berpikir MySQL memiliki padanan. Anda dapat membuat tabel sementara , pilih ke dalam tabel itu, lalu isi coursesdari tabel itu, kemudian gunakan tabel temp untuk apa pun yang Anda butuhkan.
Andrew
31

Ya itu. Kamu bisa menulis :

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

atau Anda bisa mendapatkan nilai dari gabungan lain dari ...

Dumitrescu Bogdan
sumber
INSERT INTO nama kursus, lokasi, gid SELECT nama, lokasi, '$ this-> gid' DARI kursus WHERE cid = $ cid - Saya mendapatkan kesalahan: Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk menggunakan dekat 'nama, lokasi, gid SELECT nama, lokasi,' 22 'DARI kursus DI MANA cid = 23' pada baris 1
Kyle
Saya kira bidang gid Anda adalah bilangan bulat sehingga: '22' harus menjadi 22. Ubah '$ this-> gid' dengan $ this-> gid
Alex Reche Martinez
22 dan '22' tidak masalah untuk sql, tapi saya meletakkan string jika bidang tersebut mirip dengan pengidentifikasi unik.
Dumitrescu Bogdan
8

Sintaks yang Benar: pilih ejaan salah

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

Tentu, apa yang ingin Anda gunakan untuk gid? nilai statis, PHP var, ...

Nilai statis 1234 bisa seperti:

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

Tentu saja Anda bisa.

Namun satu hal yang harus diperhatikan: INSERT INTO SELECTPernyataan menyalin data dari satu tabel dan menyisipkannya ke tabel lain DAN mengharuskan jenis data dalam tabel sumber dan target cocok. Jika tipe data dari kolom tabel yang diberikan tidak cocok (yaitu mencoba memasukkan VARCHARke dalam INT, atau TINYINTke INT) server MySQL akan melempar SQL Error (1366).

Jadi berhati-hatilah.

Berikut ini sintaks dari perintah:

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

Catatan: Ada cara untuk menghindari masalah penyisipan jenis kolom yang berbeda dengan menggunakan casting di Anda SELECT, misalnya:

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

Konversi ini ( CAST()adalah sinonim dari CONVERT()) sangat berguna jika tabel Anda memiliki rangkaian karakter yang berbeda pada kolom tabel yang sama (yang berpotensi menyebabkan hilangnya data jika tidak ditangani dengan benar).

Bud Damyanov
sumber
-2

Sintaks yang tepat untuk permintaan Anda adalah:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Martin Rafael Pérez Lara
sumber