Saya mencoba menjalankan kueri berikut:
INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name='value'
);
Tapi ini mengembalikan kesalahan. Pada dasarnya saya tidak ingin memasukkan catatan jika bidang 'nama' catatan sudah ada di catatan lain - bagaimana cara memeriksa apakah nama baru itu unik?
Jawaban:
Saya sebenarnya tidak menyarankan Anda melakukan ini, karena
UNIQUE
indeks seperti yang disarankan oleh Piskvor dan lainnya adalah cara yang jauh lebih baik untuk melakukannya, tetapi Anda benar-benar dapat melakukan apa yang Anda coba:Sisipkan catatan:
Coba masukkan catatan yang sama lagi:
Masukkan catatan yang berbeda:
Dan seterusnya...
Memperbarui:
Untuk mencegah
#1060 - Duplicate column name
kesalahan jika dua nilai mungkin sama, Anda harus memberi nama kolom SELECT bagian dalam:sumber
name
, dalam hal ini), jika memungkinkan. Perhatikan juga yang bisa Anda lakukanSELECT 'John', 'Doe', '022' FROM table_listnames
, bukanSELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
- tetapi itu hanya akan berfungsi jikatable_listnames
sudah mengandung satu atau lebih baris. Saya ragu kecepatannya berbeda, jadi mungkin itu bukan masalah.WHERE
Pernyataan itu milikSELECT
kueri. Pilih query baik mengembalikan satu baris data (data dimasukkan) atau tidak ada data sama sekali (tidak ada yang dimasukkan)SELECT 'Humbert', 'Humbert', '1'
dalam pemilihan bagian dalam). Saya menerimaERROR 1060 (42S21): Duplicate column name
#1060 - Duplicate column name
. Sudahkah Anda menemukan solusinya? Sunting: Ditemukan. Tambahkan di belakang setiap nilai sebagai AS:SELECT * FROM (SELECT 'Rupert' as name, 'Rupert' as friend, '022' as number) AS tmp
INSERT tidak mengizinkan
WHERE
sintaks .Apa yang dapat Anda lakukan: membuat
UNIQUE INDEX
bidang yang harus unik (name
), lalu gunakan:INSERT
(dan menangani kesalahan jika nama sudah ada)INSERT IGNORE
(yang akangagal secara diam-diammenyebabkan peringatan (bukan kesalahan) jika nama sudah ada)INSERT ... ON DUPLICATE KEY UPDATE
(yang akan menjalankanUPDATE
di bagian akhir jika nama sudah ada, lihat dokumentasi )sumber
mysql> show warnings\G
INSERT IGNORE
, cocok dengan regex dari^Duplicate entry '.+' for key '.+'$
INSERT IGNORE
IMO.Bekerja :
sumber
MySQL memberikan solusi yang sangat lucu:
Sangat mudah digunakan karena Anda telah mendeklarasikan kunci primer unik (di sini dengan nilai 5).
sumber
Di sini permintaan mysql, yang menyisipkan catatan jika tidak ada dan akan mengabaikan catatan serupa yang ada.
sumber
INSERT IGNORE INTO `mytable` (`field0`, `field1`, `field2`) values ('2', 12345, 12678);
?INSERT [...] IGNORE INTO mytable VALUES ...
AtauINSERT [...] IGNORE INTO mytable SET col_name={expr | DEFAULT},...
Anda dapat dengan mudah menggunakan cara berikut:
Dengan cara ini Anda dapat menyisipkan data mentah baru dan jika Anda memiliki data duplikat, ganti kolom tertentu (kolom terbaik adalah cap waktu).
Sebagai contoh :
sumber
Jika Anda benar-benar tidak bisa mendapatkan indeks unik di atas meja, Anda bisa mencoba ...
sumber
Untuk mengatasi masalah serupa, saya telah memodifikasi tabel untuk memiliki kolom yang unik. Menggunakan contoh Anda, pada pembuatan saya akan memiliki sesuatu seperti:
dan kemudian gunakan kueri berikut saat memasukkan ke dalamnya:
sumber
Kueri ini berfungsi dengan baik:
Dan Anda bisa membuat tabel menggunakan kueri berikut:
Catatan: Buat tabel menggunakan kueri kedua sebelum mencoba menggunakan kueri pertama.
sumber
Brian Hooper: Anda hampir mencapai titik tetapi Anda memiliki kesalahan di synatx Anda. Sisipan Anda tidak akan pernah berfungsi. Saya menguji pada database saya dan inilah jawaban yang tepat:
Saya memberikan Anda contoh y tabel. Sisipkan hampir sama seperti yang ditulis Bian Hooper, kecuali bahwa saya meletakkan pilih FROM DUAL dari tabel lain. Salam, Ivan
sumber
unknown table status: TABLE_TYPE
pesan, meskipun kueri menghasilkan hasil. Mungkin karena MySQL tidak memerlukanFROM DUAL
klausa?sumber
Anda memasukkan tidak Memperbarui hasil. Anda dapat menentukan kolom nama di kolom utama atau menetapkannya unik.
sumber
Saya mempunyai masalah, dan metode yang disarankan Mike berfungsi sebagian, saya mengalami kesalahan Dublicate Column name = '0', dan mengubah sintaks dari pertanyaan Anda karena ini`
Masalahnya dengan nama kolom. sum3 sama dengan sum4 dan mysql melemparkan nama kolom dublicate, dan saya menulis kode dalam sintaks ini dan bekerja dengan baik,
sumber
Saya memiliki masalah yang sama dan saya harus memasukkan beberapa jika tidak ada. Jadi dari contoh di atas saya sampai pada kombinasi ini ... ada di sini kalau-kalau ada orang yang membutuhkannya.
Perhatikan: Saya harus mendefinisikan nama di mana-mana karena diperlukan MSSQL ... MySQL berfungsi dengan * juga.
MySQL: CREATE TABLE
names
(OID
int (11) BUKAN NULL AUTO_INCREMENT,name
varchar (32) KUMPULKAN utf8_unicode_ci TIDAK NULL, KUNCI UTAMA (OID
), KUNCI UTAMA ( ), KUNCI UNIKname_UNIQUE
(name
)) MESIN = InnoDB AUTO_INCREMENT = 1;atau
MSSQL: CREATE TABLE [names] ([OID] INT IDENTITY (1, 1) BUKAN NULL, [name] NVARCHAR (32) BUKAN NULL, PRIMARY KEY CLUSTERED ([OID] ASC)); CIPTAKAN INDEX NONCLUSTERED UNIK [Index_Names_Name] ON [nama] ([nama] ASC);
sumber
Permintaan ini dapat digunakan dalam kode PHP.
Saya memiliki kolom ID di tabel ini, jadi saya perlu memeriksa duplikasi untuk semua kolom kecuali kolom ID ini:
dan sekarang item baru akan ditambahkan hanya jika tidak ada baris dengan nilai yang dikonfigurasi dalam
SET
stringsumber