MySQL Tablo DEĞERLERİNE EKLE .. vs tablo SETİNE EKLE


252

Arasındaki temel fark nedir INSERT INTO table VALUES ..ve INSERT INTO table SET?

Misal:

INSERT INTO table (a, b, c) VALUES (1,2,3)

INSERT INTO table SET a=1, b=2, c=3

Peki bu ikisinin performansı ne olacak?


12
Code Complete ve McConnell'in okunabilirlik konusundaki sürekli vurgusunu okuduktan sonra, INSERT INTO table SETstandart olmayan talihsiz görünüyor . Çok daha net görünüyor. INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])Postgres'e geçersem kendimi beladan kurtarmak için yine de sözdizimini kullanmalıyım sanırım .
cluelesscoder

Yanıtlar:


195

Anlayabildiğim kadarıyla, her iki sözdizimi de eşdeğerdir. Birincisi SQL standardı, ikincisi MySQL'in uzantısı.

Bu yüzden tam olarak eşdeğer performans açısından akıllı olmalıdırlar.

http://dev.mysql.com/doc/refman/5.6/en/insert.html diyor:

INSERT mevcut bir tabloya yeni satırlar ekler. İfadenin INSERT ... DEĞERLERİ ve INSERT ... SET formları, açıkça belirtilen değerlere göre satırlar ekler. INSERT ... SELECT formu, başka bir tablodan veya tablolardan seçilen satırları ekler.


4
Kullanarak birden çok değeri nasıl eklersiniz INSERT INTO table SET? Bu mümkün mü?
pixelfreak

2
Ne demek istiyorsun? OP örneğinde, anlayışımdaki birden çok değer olan SET a = 1, b = 2, c = 3 diyor.
Vinko Vrsalovic

10
Demek istediğim, birden çok satır ekle. Gibi: tabloya (a, b, c) yerleştirin DEĞERLER (1,2,3), (4,5,6), (7,8,9);
pixelfreak

5
Yalnızca VALUES sözdizimi kullanan INSERT deyimleri birden çok satır ekleyebilir.
Vinko Vrsalovic

8
@VinkoVrsalovic, doğru değil, insert select, birden fazla satır seçildiğinde birden çok satır ekleyebilir
Pacerier

15

Uzantı ekler ve güncellemeler için benzer bir sözdizimine izin vermeyi amaçladığını düşünüyorum. Oracle'da benzer bir sözdizimsel hile:

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)

5
@Pacerier gibi? Gördüğüm tek sorun bir taşınabilirlik sorunudur (birçok bağlamda gerçekten önemli değildir); bir şey mi kaçırıyorum?
Mark Amery

1
@MarkAmery, evet ona baktığınızda gerçek bir faydası yok. Dezavantaj gereksiz zaman kaybıdır , bu ipliğin tüm varlığı benim açımdan kanıtlar.
Pacerier

8
@Pacerier Ne demek istediğimi anlayamadım mı? Ne zaman boşa harcanıyor? Daha önce işaret edilmiş bir fayda var: INSERT ifadenizi oluşturmak için sadece bir kez anahtar / değer çiftleri dizisi üzerinde bir kez döngü yapmanız, VALUES sözdizimini kullanmanız gerektiğinden iki kat yerine, daha kısa, daha net ve daha hızlı yazma kodu.
Mark Amery

@MarkAmery ama bu oracle hüner değil sahip olduğu faydayı. Önce tüm sütunları, sonra tüm değerleri adlandırın.
hobbs

12
@Pacerier Bu adil bir nokta ve tartılacak bir ödünleşim var. Özelliği Karşı Eğer taşınabilirlik sorunları ve zaman arasındaki farkı araştırma boşa sahip INSERT ... SET ...ve INSERT ... VALUES .... Bu özellik için, daha kısa, daha hızlı yazma koduna, daha fazla okunabilirliğe ve VALUESyan tümcenizi yazarken sütun sırasınızı karıştırmanın neden olduğu yazım hatalarının giderilmesine sahipsiniz . Bağırcım bana net olarak iyinin kötüye ağır bastığını söyler, ancak kararınız farklı olabilir.
Mark Amery

4

INSERT INTO table SET x=1, y=2Sözdizimleri eşdeğer olduğundan (yine de MySQL'de), sözdizimini tercih ediyorum , çünkü özellikle çok sayıda sütun eklerken ifadede değişiklik yapmak ve hataları yakalamak daha kolay. 10 veya 15 veya daha fazla sütun eklemeniz gerekiyorsa (x, y) VALUES (1,2), bence sözdizimini kullanarak bir şeyi karıştırmak gerçekten kolaydır .

Farklı SQL standartları arasındaki taşınabilirlik bir sorunsa, belki INSERT INTO table (x, y) VALUES (1,2)de tercih edilir.

Ve tek bir sorguya birden çok kayıt eklemek istiyorsanız, INSERT INTO ... SETsözdizimi işe yarayacak gibi görünürken, diğeri çalışacaktır. Ancak çoğu pratik durumda, ekler yapmak için bir dizi kayıt arasında dolaşıyorsunuz, ancak bir sorgudaki bir tabloya bir grup satır eklemek için bir büyük sorgu oluşturabileceğiniz bazı durumlar olabilir. her satırda bir performans artışı olabilir. Gerçekten bilmiyorum.

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.