SELECT ile ekle


287

Bir select kullanarak ekler bir sorgu var:

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

Ekleme için yalnızca "ad, konum" seçilebilir ve gid sorguda başka bir şeye ayarlanabilir mi?

Yanıtlar:


548

Evet, kesinlikle, ama sentaksını kontrol et.

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

gidTabii ki sadece 1 değil, yerine aynı türden bir sabit koyabilirsiniz . Ve sadece ciddeğeri uydurdum .


2
Çalıştım, çok teşekkür ederim. Insert Select ile alan adlarında parantez gerekmez. Ancak, seçimin üstünde değerler belirtmeye başladığınızda, alan adlarının etrafında () olması gerektiği anlaşılıyor.
Kyle

Ekleme yan tümcesinde takma adları kullanamayacağınızı unutmayın: "t1 (t1.name, t1.location, t1.gid) kurslarına INSERT INT
raphael

@Andrew, bir dahaki sefere select çalıştırmadan aynı seçimi geri döndürmek için herhangi bir yöntem var mı? ders tablosunu eklemek ve sonucunu almak
istersem

1
@TAHASULTANTEMURI Farklı bir soru. Ama ne istediğini anlıyorsam, SQL Server (ne istediğini değil, ama bugünlerde kullandığım) OUTPUTyan tümcesi var , bu da eklediğin her şeyi başka bir tabloya koymanı sağlıyor. MySQL'in eşdeğeri olduğunu düşünmüyorum. Sen belki geçici bir tablo oluşturmak doldurmak, sonra o tabloya seçmek, courseso zaman gerekli başka ne olursa olsun geçici tablo kullanmak, o tablodan.
Andrew

31

Evet öyle. Yazabilirsin :

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

ya da seçmenin başka bir birleşiminden değerler alabilirsiniz ...


Ders adı, konumu, gid SEÇİN AD, isim, konum, '$ this-> gid' Derslerden NEREDE cid = $ cid - Hatayı alıyorum: SQL sözdiziminizde bir hata var; 'name, location, gid SELECT name, location,' 22 'derslerinden WHERE cid = 23'
Kyle

Sanırım gid alanınız bir tamsayı yani: '22' 22 olmalı. '$ This-> gid' $ this-> gid ile değiştirin
Alex Reche Martinez

22 ve '22' sql için önemli olmamalı, ancak alanın benzersiz bir tanımlayıcıya benzemesi durumunda bir dize koydum.
Dumitrescu Bogdan

8

Doğru Sözdizimi: yazımı seç yanlıştı

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

5

Tabii, gid için ne kullanmak istiyorsun? statik bir değer, PHP var, ...

1234 statik değeri şöyle olabilir:

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


1

Tabi ki yapabilirsin.

Ancak bir şey not edilmelidir: INSERT INTO SELECTİfade bir tablodaki verileri kopyalar ve başka bir tabloya ekler VE kaynak ve hedef tablolardaki veri türlerinin eşleşmesini gerektirir. Belirtilen tablo sütunlarındaki veri türleri eşleşmezse (yani , içine veya içine VARCHARgirmeye çalışırken ) MySQL sunucusu bir .INTTINYINTINTSQL Error (1366)

Yani dikkatli ol.

Komutun sözdizimi şöyledir:

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

Yan Not: kullanarak hileli farklı sütun tipleri yerleştirme sorununa bir yolu yoktur casting Gözlerinde farklı SELECTörneğin:

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

Bu dönüşüm ( CAST()eşanlamlısıdır CONVERT()), tablolarınız aynı tablo sütununda farklı karakter kümelerine sahipse çok kullanışlıdır (bu, düzgün bir şekilde ele alınmadığında veri kaybına neden olabilir).


-2

Sorgunuz için doğru sözdizimi:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.