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.