MySQL Sisipkan Di mana kueri


121

Apa yang salah dengan kueri ini:

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Ini bekerja tanpa WHEREklausul. Sepertinya saya lupa SQL saya ..

Jawaban:


237

MySQL INSERT Syntax tidak mendukung klausa WHERE sehingga kueri Anda seperti aslinya akan gagal. Dengan asumsi idkolom Anda unik atau kunci utama:

Jika Anda mencoba memasukkan baris baru dengan ID 1, Anda harus menggunakan:

INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);

Jika Anda mencoba mengubah nilai bobot / bobot yang diinginkan untuk baris yang ada dengan ID 1, Anda harus menggunakan:

UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;

Jika mau, Anda juga dapat menggunakan INSERT .. ON DUPLICATE KEY sintaks seperti:

INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

ATAU bahkan seperti itu:

INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

Penting juga untuk dicatat bahwa jika idkolom Anda adalah kolom autoincrement maka Anda mungkin juga menghilangkannya dari INSERT Anda bersama-sama dan membiarkan mysql menaikkannya seperti biasa.


1
Terima kasih atas jawaban yang bagus. Saat menggunakan kueri UPDATE berfungsi dengan baik. Tapi, jika id adalah primary key & auto increment key maka pernyataan INSERT di atas tidak berfungsi.Error Duplicate entry '1' for key 1.
JDGuide

1
@JDeveloper Itu karena baris tersebut sudah ada. Seperti yang disebutkan Chad, If you're trying to insert a new row with ID 1 you should be usingINSERT INTO. Dalam kasus Anda, Anda mencoba memasukkan ketika ID 1 sudah ada dan itu adalah kunci utama atau unik dan gagal sehingga Anda harus menggunakan sintaks UPDATE atau INSERT .. PADA sintaks DUPLICATE KEY
Anthony Hatzopoulos

41

Anda tidak dapat menggabungkan klausa WHERE dengan klausa VALUES. Sejauh yang saya tahu, Anda memiliki dua opsi-

  1. INSERT menentukan nilai

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. SISIPKAN menggunakan pernyataan SELECT

    INSERT INTO Users(weight, desiredWeight) 
    SELECT weight, desiredWeight 
    FROM AnotherTable 
    WHERE id = 1

19

Anda menggunakan klausa WHERE untuk kueri UPDATE. Saat Anda MASUKKAN, Anda berasumsi bahwa baris tersebut tidak ada.

Pernyataan OP kemudian menjadi;

UPDATE Pengguna SET berat = 160, Berat yang diinginkan = 45 di mana id = 1;

Di MySQL, jika Anda ingin INSERT atau UPDATE, Anda dapat menggunakan query REPLACE dengan klausa WHERE. Jika WHERE tidak ada, itu INSERTS, jika tidak maka DIPERBARUI.

EDIT

Saya pikir poin Bill Karwin cukup penting untuk ditarik dari komentar dan membuatnya sangat jelas. Terima kasih Bill, sudah terlalu lama sejak saya bekerja dengan MySQL, saya ingat bahwa saya memiliki masalah dengan REPLACE, tetapi saya lupa apa itu. Aku seharusnya mencarinya.

Itu bukan cara kerja REPLACE MySQL. Ini melakukan DELETE (yang mungkin tidak ada operasi jika baris tidak ada), diikuti dengan INSERT. Pikirkan konsekuensinya vis. pemicu dan dependensi kunci asing. Sebagai gantinya, gunakan INSERT ... ON DUPLICATE KEY UPDATE.


7
Itu bukan cara kerja REPLACE MySQL. Ini melakukan DELETE (yang mungkin tidak ada operasi jika baris tidak ada), diikuti dengan INSERT. Pikirkan konsekuensinya vis. pemicu dan dependensi kunci asing. Sebagai gantinya, gunakan INSERT ... ON DUPLICATE KEY UPDATE.
Bill Karwin


5

Sisipkan kueri tidak mendukung di mana kata kunci *

Kondisi berlaku karena Anda bisa menggunakan kondisi where untuk pernyataan sub-pilih. Anda dapat melakukan penyisipan yang rumit menggunakan sub-pilihan.

Sebagai contoh:

INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';

Dengan menempatkan "pilih" dalam pernyataan sisipkan, Anda dapat melakukan beberapa penyisipan dengan cepat.

Dengan jenis penyisipan ini, Anda mungkin ingin memeriksa jumlah baris yang disisipkan. Anda dapat menentukan jumlah baris yang akan disisipkan dengan menjalankan pernyataan SQL berikut sebelum melakukan penyisipan.

SELECT count(*)
FROM customers
WHERE city = 'Newark';

Anda dapat memastikan bahwa Anda tidak memasukkan informasi duplikat dengan menggunakan kondisi EXISTS.

Misalnya, jika Anda memiliki tabel bernama klien dengan kunci utama client_id, Anda dapat menggunakan pernyataan berikut:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

Pernyataan ini menyisipkan banyak record dengan subselect.

Jika Anda ingin memasukkan satu record, Anda dapat menggunakan pernyataan berikut:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

Penggunaan tabel ganda memungkinkan Anda memasukkan nilai-nilai Anda dalam pernyataan pilih, meskipun nilai-nilai tersebut saat ini tidak disimpan dalam tabel.

Lihat juga Cara menyisipkan klausa with where


4

Jawaban yang benar untuk pertanyaan ini adalah seperti ini:

Sebuah). JIKA ingin memilih sebelum memasukkan:

INSERT INTO Users( weight, desiredWeight ) 
  select val1 , val2  from tableXShoulatNotBeUsers
  WHERE somecondition;

b). JIKA catatan sudah ada gunakan pembaruan, bukan sisipkan:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Seharusnya

Update Users set weight=160, desiredWeight=145  WHERE id = 1;

c). Jika Anda ingin memperbarui atau menyisipkan pada saat yang bersamaan

Replace Users set weight=160, desiredWeight=145  WHERE id = 1;

Note):- you should provide values to all fields else missed field in query 
        will be set to null

d). Jika Anda ingin CLONE record dari tabel SAMA, ingat saja Anda tidak dapat memilih dari tabel yang Anda masukkan.

 create temporary table xtable ( weight int(11), desiredWeight int(11) ;

 insert into xtable (weight, desiredWeight) 
    select weight, desiredWeight from Users where [condition]

 insert into Users (weight, desiredWeight) 
    select weight , desiredWeight from xtable;

Saya pikir ini cukup mencakup sebagian besar skenario


3

Anda tidak dapat menggunakan WHERE saat melakukan pernyataan INSERT:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

seharusnya:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );

Bagian WHERE hanya berfungsi dalam pernyataan SELECT:

SELECT from Users WHERE id = 1;

atau dalam pernyataan UPDATE:

UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;

2

Insert into = Menambahkan baris ke tabel

Upate = perbarui baris tertentu.

Apa yang akan dijelaskan klausa where dalam sisipan Anda? Tidak ada yang cocok, baris tidak ada (belum) ...


2

Anda dapat melakukan INSERT bersyarat berdasarkan input pengguna. Kueri ini hanya akan disisipkan jika vars input '$ userWeight' dan '$ userDesiredWeight' tidak kosong

INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1

Itu tergantung pada situasi INSERT sebenarnya dapat memiliki klausa where.

Misalnya jika Anda mencocokkan nilai dari formulir.

Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com

Masuk akal bukan?


apakah mungkin di mana klausul dalam pernyataan sisipan
Taja_100

1

Cara termudah adalah menggunakan IF untuk melanggar batasan utama Anda. Ini hanya berfungsi untuk INSERT IGNORE tetapi akan memungkinkan Anda menggunakan batasan dalam INSERT.

INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');

1

Setelah WHEREklausa Anda meletakkan kondisi, dan itu digunakan untuk mengambil data atau untuk memperbarui baris. Saat Anda memasukkan data, diasumsikan bahwa baris tersebut tidak ada.

Lantas, pertanyaannya, adakah baris yang idnya 1? jika demikian, gunakan MySQL UPDATE , jika tidak gunakan MySQL INSERT .


1

Jika Anda menentukan record tertentu tidak untuk memasukkan data, lebih baik menggunakan UPDATEpernyataan daripada INSERTpernyataan.

Jenis kueri yang Anda tulis dalam pertanyaan ini seperti kueri dummy.

Kueri Anda adalah: -

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Di sini, Anda menentukan id = 1, jadi lebih baik Anda menggunakan UPDATEpernyataan untuk memperbarui record yang ada. Tidak disarankan menggunakan WHEREklausa dalam kasus INSERT.Anda harus menggunakan UPDATE.

Sekarang Menggunakan Update Query: -

UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;

Tidak ada kueri mate.1st yang tidak akan berfungsi. Kueri pertama adalah pertanyaan yang diajukan.
JDGuide

Mengapa Anda menyarankan pembaruan daripada penyisipan? Pengguna ingin memasukkan nilai dengan kondisi dan tidak memperbarui catatan yang keluar.
Somnath Muluk

1

Apakah klausa WHERE sebenarnya dapat digunakan dengan INSERT-INTO-VALUES?

Jawabannya pasti tidak.

Menambahkan klausa WHERE setelah INSERT INTO ... VALUES ... hanyalah SQL yang tidak valid, dan tidak akan mengurai.

Kesalahan yang dikembalikan oleh MySQL adalah:

mysql> INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 1' at line 1

Bagian terpenting dari pesan kesalahan adalah

... syntax to use near 'WHERE id = 1' ...

yang menunjukkan bagian spesifik yang tidak diharapkan parser untuk ditemukan di sini: klausa WHERE.


1

itu benar-benar salah. INSERT QUERY tidak memiliki klausa WHERE, Hanya UPDATE QUERY yang memilikinya. Jika Anda ingin menambahkan data Dimana id = 1 maka Query Anda akan

UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;

1

Tidak. Sejauh yang saya tahu, Anda tidak dapat menambahkan klausa WHERE ke dalam kueri ini. Mungkin saya juga lupa SQL saya, karena saya tidak begitu yakin mengapa Anda membutuhkannya.


1

Anda tidak boleh menggunakan kondisi mana dalam pernyataan Sisipkan. Jika Anda ingin melakukannya, gunakan insert in a update statement dan kemudian perbarui record yang ada.

Sebenarnya bisakah saya tahu mengapa Anda membutuhkan klausa where dalam pernyataan Insert ??

Mungkin berdasarkan alasan saya mungkin menyarankan Anda opsi yang lebih baik.


1

Saya pikir pilihan terbaik Anda adalah menggunakan REPLACE, bukan INSERT

GANTI KE Pengguna (id, berat, bobot yang diinginkan) NILAI (1, 160, 145);


1

JANGAN BACA INI JUGA

Ini tidak masuk akal ... bahkan secara harfiah

INSERTberarti menambahkan a new rowdan ketika Anda mengatakan WHEREAnda menentukan baris mana yang Anda bicarakan diSQL .

Jadi menambahkan baris baru tidak dimungkinkan dengan kondisi pada baris yang sudah ada.

Anda harus memilih dari berikut ini:

A. Gunakan UPDATE sebagai penggantiINSERT

B.Gunakan INSERTdan hapus WHEREklausa (Saya hanya mengatakannya ...) atau jika Anda benar-benar terikat untuk menggunakan INSERTdan WHEREdalam satu pernyataan itu hanya dapat dilakukan melalui INSERT..PILIH klausa ...

INSERT INTO Users( weight, desiredWeight ) 
SELECT FROM Users WHERE id = 1;

Tetapi ini melayani tujuan yang sama sekali berbeda dan jika Anda telah menetapkan id sebagai Kunci Utama, penyisipan ini akan gagal, jika tidak, baris baru akan dimasukkan dengan id = 1.


ya Anda benar, mengetahui semua hal ini bangun membuat kesalahan.
Asesha George

1

Saya menyadari bahwa ini adalah posting lama tetapi saya berharap ini masih akan membantu seseorang, dengan apa yang saya harap adalah contoh sederhana:

Latar Belakang:

Saya memiliki banyak kasus: pengguna yang sama terdaftar beberapa kali dengan banyak nilai dan saya ingin Membuat catatan baru, maka UPDATE tidak masuk akal dalam kasus saya dan saya perlu menangani pengguna tertentu seperti yang akan saya lakukan menggunakan klausa WHERE.

INSERT into MyTable(aUser,aCar)
value(User123,Mini)

Dengan menggunakan konstruksi ini Anda sebenarnya menargetkan pengguna tertentu (user123, yang memiliki catatan lain) sehingga Anda tidak benar-benar membutuhkan klausa where, saya rasa.

outputnya bisa jadi:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

1

Salah satu cara untuk menggunakan INSERT dan WHERE adalah

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); Dalam hal ini ist seperti tes yang ada. Tidak ada pengecualian jika Anda menjalankannya dua kali atau lebih ...


0

sintaks yang benar untuk memasukkan mysql ke dalam pernyataan menggunakan metode posting adalah:

$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";

1
Anda perlu keluar dari parameter tidak tepercaya seperti nama pengguna atau menggunakan kueri berparameter untuk mencegah penyerang memasukkan perintah SQL sewenang-wenang . Dan gunakan salah satu algoritma HashCrypt untuk menyimpan kata sandi.
Hendrik Brummermann

0

Saya tidak berpikir bahwa kita dapat menggunakan klausa mana dalam pernyataan sisipan


0
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1
Dapatkah Anda mengedit jawaban yang Anda usulkan untuk memperluas apa yang dilakukannya dan bagaimana jawaban itu menangani OP?
Ro Yo Mi

0

Anda tidak dapat menggunakan INSERT dan WHERE secara bersamaan. Anda dapat menggunakan klausa UPDATE untuk menambah nilai pada kolom tertentu di bidang tertentu seperti kode di bawah ini;

UPDATE Users
SET weight='160',desiredWeight ='145'  
WHERE id =1

0

Saya pikir bentuk yang benar untuk memasukkan nilai pada baris yang ditentukan adalah:

UPDATE table SET column = value WHERE columnid = 1

ini berfungsi, dan serupa jika Anda menulis di Microsoft SQL Server

INSERT INTO table(column) VALUES (130) WHERE id = 1;

di mysql Anda harus memperbarui tabel.


0

Anda dapat melakukannya dengan kode di bawah ini:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.