Saya mengalami kesulitan saat membentuk INSERT bersyarat
Saya memiliki x_table dengan kolom (instance, user, item) di mana ID instance unik. Saya ingin menyisipkan baris baru hanya jika pengguna sudah tidak memiliki item tertentu.
Misalnya mencoba memasukkan instance = 919191 pengguna = 123 item = 456
Insert into x_table (instance, user, item) values (919191, 123, 456)
ONLY IF there are no rows where user=123 and item=456
Bantuan atau panduan apa pun ke arah yang benar akan sangat dihargai.
sumber
dual
perlu dibuat sebelumnya dalam kasus ini atau apakah itu semacam tabel "sementara" khusus yang dibuat oleh kueri untuk penggunaan kueri saja?dual
, Anda perlu membuatnya.CREATE TABLE dual ( dummy CHAR(1) DEFAULT 'x' NOT NULL CHECK (dummy = 'x') PRIMARY KEY ); INSERT INTO dual VALUES('x'); REVOKE ALL ON dual FROM PUBLIC; GRANT SELECT ON dual TO PUBLIC;
SELECT COUNT(*) FROM dual
selalu mendapatkan1
, dan jikaSELECT 'foo' FROM dual
Anda selalu mendapatkanfoo
. Tapi Anda tidak bisaSELECT * FROM dual
dan Anda tidak bisaDESCRIBE dual
atau semacamnya. Saya belum memeriksanya, tapi menurut saya Anda juga tidak bisa mencabut izindual
. Jadi perlu ditunjukkan bahwa ini berfungsi seperti yang Anda harapkan ... kecuali jika tidak;)Anda juga dapat menggunakan
INSERT IGNORE
yang secara diam-diam mengabaikan penyisipan alih-alih memperbarui atau menyisipkan baris saat Anda memiliki indeks unik pada (pengguna, item).Kueri akan terlihat seperti ini:
Anda dapat menambahkan indeks unik dengan
CREATE UNIQUE INDEX user_item ON x_table (user, item)
.sumber
Pernahkah Anda mencoba hal seperti itu?
sumber
Dengan
UNIQUE(user, item)
, lakukan:yang
user=123
sedikit adalah "no-op" untuk mencocokkan sintaks dariON DUPLICATE
klausa tanpa benar-benar melakukan apa-apa ketika ada duplikat.sumber
Jika Anda tidak ingin menetapkan batasan unik, ini berfungsi seperti pesona:
Semoga membantu!
sumber
Apa yang kamu inginkan adalah
INSERT INTO table (...) SELECT ... WHERE ...
. dari manual MySQL 5.6 .Dalam kasus Anda itu:
Atau mungkin karena Anda tidak menggunakan logika rumit apa pun untuk menentukan apakah akan menjalankan
INSERT
atau tidak, Anda bisa menyetelUNIQUE
kunci pada kombinasi dua kolom ini dan kemudian menggunakannyaINSERT IGNORE
.sumber
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...
(menjalankan 5.6.34)from dual
sebelumnyawhere
.FROM DUAL
adalah default jika tidak ada tabel yang direferensikan ( lihat dokumentasi ini ).Jika Anda menambahkan batasan yang (x_table.user, x_table.item) unik, maka memasukkan baris lain dengan pengguna dan item yang sama akan gagal.
misalnya:
sumber
Meskipun ada baiknya untuk memeriksa duplikasi sebelum memasukkan data Anda, saya menyarankan agar Anda meletakkan batasan / indeks unik pada kolom Anda sehingga tidak ada data duplikat yang dapat disisipkan secara tidak sengaja.
sumber
Anda dapat menggunakan solusi berikut untuk menyelesaikan masalah Anda:
sumber
Sedikit modifikasi pada respons Alex, Anda juga bisa merujuk nilai kolom yang ada:
sumber
Jadi yang ini adalah singkatan dari PostgreSQL
sumber
Sintaksnya dapat bervariasi tergantung pada DB Anda ...
sumber