Saya mencoba menggunakan pernyataan pilih untuk mendapatkan semua kolom dari tabel MySQL tertentu kecuali satu. Apakah ada cara sederhana untuk melakukan hal ini?
SUNTING: Ada 53 kolom dalam tabel ini (BUKAN DESAIN SAYA)
53 kolom? Saya akan tetap menggunakan SELECT * seperti yang disarankan Thomas dalam kasus itu ... kecuali kolom tambahan itu memiliki sejumlah besar data yang tidak diinginkan untuk diambil ...?
Mike Stone
Kecuali satu kolom ... Saya kira Anda tahu mana yang harus diabaikan, maka INFORMATION_SCHEMA.kolom adalah caranya.
Alfabravo
Lihat jawaban ini yang melakukan apa yang ingin Anda lakukan!
donL
Kolom big data adalah masalah nyata ketika data geografis disimpan. Kolom dapat berukuran banyak megabita. Mereka bekerja dengan baik di mana klausa untuk menemukan baris, tetapi Anda sering tidak ingin data dalam hasil.
Jason
Penggunaan umum untuk ini adalah mengecualikan kolom ID kenaikan-otomatis. Misalnya, untuk memilih data yang akan dimasukkan ke dalam tabel yang berbeda, yang memiliki ID sendiri.
ToolmakerSteve
Jawaban:
222
Sebenarnya ada cara, Anda harus memiliki izin untuk melakukan ini ...
SET@sql = CONCAT('SELECT ',(SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),'<columns_to_omit>,','')FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='<table>'AND TABLE_SCHEMA ='<database>'),' FROM <table>');
PREPARE stmt1 FROM@sql;EXECUTE stmt1;
Mengganti <table>, <database> and <columns_to_omit>
Ini jauh lebih buruk daripada hanya menentukan kolom yang merupakan praktik terbaik yang diketahui.
HLGEM
3
Ini tidak berfungsi jika ada spasi di nama kolom. Itu harus diperbarui untuk selalu mengelilingi nama-nama di backticks<column_name>
adamF
3
Ini juga tidak akan berfungsi jika kolom yang diabaikan adalah yang terakhir yang tercantum dalam struktur tabel (karena penggantian tidak akan cocok dengan koma trailing).
Vincent Pazeller
61
Dalam definisi mysql (manual) tidak ada hal seperti itu. Tetapi jika Anda memiliki jumlah kolom yang sangat besar col1, ...,, col100berikut ini dapat bermanfaat:
Beri saya pesan kesalahan pada langkah ke-3: "Jumlah kolom tidak cocok dengan jumlah nilai pada baris 1". Jadi saya mengubah langkah 2 menjadi "UPDATE temp_tb SET id = NULL" dan kemudian berhasil.
oyvey
1
Ok, ini berhasil. Tetapi ketika saya menjalankan kueri ini lagi, itu memberi saya kesalahan, bahwa, temp_tb sudah ada. Untuk berapa banyak waktu temp_tb ada di memori? Mohon maaf jika itu pertanyaan bodoh. PS membatalkan jawaban Anda.
Karan
2
@Karan Untuk menjalankan kueri ini berulang kali, tambahkan perintah lain ke awal:DROP TABLE IF EXISTS temp_tb;
gregn3
1
@Karan Untuk menentukan mesin memori, gunakan perintah:, CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb); jika tidak, ia disimpan ke disk secara default, dan selamat dari server restart. ( terima kasih )
gregn3
Jawaban yang sangat bagus. Untuk menjatuhkan beberapa kolom , lihat jawaban ini .
S3DEV
45
Apakah tampilan bekerja lebih baik dalam kasus ini?
HA HA! Ya, tentu. Sekarang bagaimana Anda membangun tampilan untuk memasukkan semua TAPI salah satu kolom. Saya pikir Anda melihat bagaimana ini menimbulkan pertanyaan asli. Bahkan, saya menemukan utas ini secara khusus karena saya ingin membuat tampilan yang mengecualikan kolom tertentu tanpa dipaksa untuk membuat daftar semua kolom yang tersisa secara eksplisit dalam definisi tampilan.
Sebagian besar jawaban yang berperingkat lebih tinggi kebanyakan hanya menemukan cara untuk menghasilkan kueri yang tepat ini tanpa mengetik dengan tangan
mehtunguh
5
Sebenarnya, untuk alasan pemeliharaan, sangat berguna untuk memiliki jenis pertanyaan "segalanya kecuali". Kalau tidak, daftar bidang eksplisit harus diperbarui jika bidang baru ditambahkan kemudian.
leiavoia
1
@lev, itu benar dan MEREKA HARUS MENJADI !!! SEBELUM Anda tidak tahu apakah Anda ingin memiliki kolom di masa depan (mungkin itu adalah kolom data meta atau yang tidak berlaku untuk layar tertentu). Kamu tidak; ingin merusak kinerja dengan mengembalikan lebih dari yang Anda butuhkan (yang benar 100% dari waktu ketika Anda memiliki gabung dalam) Saya sarankan Anda membaca tentang mengapa pilih * adalah antipattern SQL.
HLGEM
26
OP menyatakan ada> 50 kolom jadi ini agak tidak praktis.
augurar
1
@HLGEM Tidak juga, saya ingin memilih semua kolom tanpa mempertahankan kueri setiap kali saya menambahkan kolom baru, kecuali salah satu dari mereka, dan ini tidak akan berhasil dalam kasus saya. Tapi bagaimanapun aku menerapkan solusi Sean O untuk diriku sendiri
OverCoder
26
Jika Anda mencari untuk mengecualikan nilai bidang, misalnya untuk masalah keamanan / info sensitif, Anda dapat mengambil kolom itu sebagai nol.
Mengapa? Itu tidak bekerja. Jika Anda memiliki gaji kolom, kueri ini hanya akan berakhir dengan hasil memiliki dua kolom bernama gaji, satu penuh nol dan satu dengan gaji aktual.
Myforwik
4
@Myforwik Permintaan ini memang menambahkan salarykolom kedua . Tapi karena itu diambil setelah *, itu menimpa yang asli. Itu tidak cantik, tetapi itu berhasil.
Sean O
68
SQL selalu mengizinkan duplikat nama kolom dalam hasil-set. Jika Anda ingin ini berfungsi, Anda harus menjalankannya dengan aplikasi klien yang tidak mendukung dupes dan memberikan prioritas pada dupe terakhir. Klien baris perintah resmi mendukung dupes. HeidiSQL mendukung mereka juga. SQL Fiddle tidak, tetapi menampilkan dupe pertama , bukan yang terakhir. Singkatnya: ini tidak berhasil .
Álvaro González
9
Tentu saja itu tidak berhasil. Ini adalah contoh yang bagus mengapa Anda harus menguji jawaban Anda di mysql sendiri, alih-alih melalui perpustakaan yang berbicara dengan mysql.
Myforwik
8
@SeanO, @ Alastair, @ Semuanya, Tidak Mengesampingkan. Server masih mengembalikan data sensitif.
Pacerier
22
Sejauh pengetahuan saya, tidak ada. Anda dapat melakukan sesuatu seperti:
SELECT col1, col2, col3, col4 FROM tbl
dan secara manual pilih kolom yang Anda inginkan. Namun, jika Anda ingin banyak kolom, maka Anda mungkin hanya ingin melakukan:
SELECT*FROM tbl
dan abaikan saja apa yang tidak Anda inginkan.
Dalam kasus khusus Anda, saya akan menyarankan:
SELECT*FROM tbl
kecuali Anda hanya ingin beberapa kolom. Jika Anda hanya ingin empat kolom, maka:
SELECT col3, col6, col45, col 52FROM tbl
akan baik-baik saja, tetapi jika Anda menginginkan 50 kolom, maka setiap kode yang membuat kueri akan menjadi (juga?) sulit dibaca.
Pilih * adalah pilihan yang buruk selalu. Jangan rekomendasikan itu. Baca mengapa ini adalah SQl Antipattern.
HLGEM
18
Saat mencoba solusi oleh @Mahomedalid dan @Junaid saya menemukan masalah. Jadi terpikir untuk membagikannya. Jika nama kolom memiliki spasi atau tanda hubung seperti check-in maka kueri akan gagal. Solusi sederhana adalah dengan menggunakan backtick di sekitar nama kolom. Kueri yang dimodifikasi ada di bawah
SET@SQL = CONCAT('SELECT ',(SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME,"`"))FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'AND COLUMN_NAME NOTIN('id')),' FROM users');
PREPARE stmt1 FROM@SQL;EXECUTE stmt1;
Jika kolom yang tidak ingin Anda pilih memiliki sejumlah besar data di dalamnya, dan Anda tidak ingin memasukkannya karena masalah kecepatan dan Anda sering memilih kolom lainnya, saya sarankan Anda membuat tabel baru dengan satu bidang yang biasanya tidak Anda pilih dengan kunci ke tabel asli dan hapus bidang dari tabel asli. Bergabunglah dengan tabel ketika bidang ekstra itu benar-benar diperlukan.
Masalah utama saya adalah banyak kolom yang saya dapatkan ketika bergabung dengan tabel. Meskipun ini bukan jawaban untuk pertanyaan Anda (cara memilih semua kecuali kolom tertentu dari satu tabel), saya pikir perlu disebutkan bahwa Anda dapat menentukan untuk mendapatkan semua kolom dari tabel tertentu, bukan hanya menentukan .table.
Berikut adalah contoh bagaimana ini bisa sangat berguna:
pilih pengguna. *, phone.meta_value sebagai telepon, zipcode.meta_value sebagai zipcode
dari pengguna
tinggalkan gabung user_meta sebagai ponsel
pada ((users.user_id = phone.user_id) AND (phone.meta_key = 'phone'))
tinggalkan gabung user_meta sebagai kode pos
pada ((users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode'))
Hasilnya adalah semua kolom dari tabel pengguna, dan dua kolom tambahan yang digabungkan dari tabel meta.
terima kasih, saya perlu memilih semua kolom dari tabel pertama dan hanya satu bidang dari tabel kedua dalam bergabung dan jawaban Anda membantu saya.
mohammad falahat
5
Saya menyukai jawaban dari @Mahomedalidselain fakta ini diinformasikan dalam komentar dari @Bill Karwin. Kemungkinan masalah yang diangkat @Jan Koritakadalah benar saya menghadapi itu, tetapi saya telah menemukan trik untuk itu dan hanya ingin membagikannya di sini untuk siapa saja yang menghadapi masalah.
kita bisa mengganti fungsi REPLACE dengan klausa tempat dalam sub-kueri pernyataan Disiapkan seperti ini:
Menggunakan nama tabel dan kolom saya
SET@SQL = CONCAT('SELECT ',(SELECT GROUP_CONCAT(COLUMN_NAME)FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'AND COLUMN_NAME NOTIN('id')),' FROM users');
PREPARE stmt1 FROM@SQL;EXECUTE stmt1;
Jadi, ini akan mengecualikan hanya bidang idtetapi tidakcompany_id
Kerjanya seperti kontrak dengan kode dan ketika melihat kueri, Anda tahu persis data apa yang dapat Anda ekstrak dari itu tanpa melihat skema tabel.
mbillard
6
@ododecraft: Ini praktik yang baik untuk alasan yang sama sehingga praktik yang baik untuk selalu mengembalikan tipe yang sama dari suatu fungsi (bahkan jika Anda bekerja dalam bahasa yang tidak dipaksakan). Pada dasarnya hanya Prinsip Terkejut.
Daniel Pryden
4
Kerjakan saja
SELECT*FROMtableWHERE whatever
Lalu taruh kolom di bahasa pemrograman favorit Anda: php
Kecuali kolom yang ingin Anda kecualikan adalah Gumpalan besar atau semacamnya.
Bill Karwin
1
Ini buruk jika Anda mencoba untuk menghindari data yang terbuang.
Kristopher Ives
1 kolom dari 53 seharusnya tidak membuat perbedaan. Jika berhasil, mungkin desainnya buruk.
Petr Peller
1
Memilih * adalah antipattern SQL dan seharusnya tidak pernah digunakan dalam kode produksi.
HLGEM
1
Saya tidak setuju bahwa SELECT * adalah semacam anti-pola yang seharusnya "tidak pernah" digunakan dalam kode produksi. Jauh lebih jelas bahwa Anda telah mengambil semua kolom Anda - dibandingkan dengan referensi silang daftar panjang kolom yang mungkin, atau tidak, sebenarnya semua bidang. Ini juga, sangat jelas, lebih cepat untuk dikodekan, sejauh ini. Dan ada banyak, banyak kasus di mana bidang tabel akan sesuai persis dengan bidang dalam tampilan atau formulir.
Geoff Kendall
4
Saya setuju dengan solusi "sederhana" untuk mendaftarkan semua kolom, tetapi ini bisa memberatkan, dan kesalahan ketik dapat menyebabkan banyak waktu terbuang. Saya menggunakan fungsi "getTableColumns" untuk mengambil nama-nama kolom saya yang cocok untuk menempel ke kueri. Maka yang perlu saya lakukan adalah menghapus yang tidak saya inginkan.
CREATEFUNCTION`getTableColumns`(tablename varchar(100))
RETURNS varchar(5000) CHARSET latin1
BEGINDECLARE done INT DEFAULT0;DECLARE res VARCHAR(5000)DEFAULT"";DECLARE col VARCHAR(200);DECLARE cur1 CURSORFORselect COLUMN_NAME from information_schema.columns
where TABLE_NAME=@tableAND TABLE_SCHEMA="yourdatabase"ORDERBY ORDINAL_POSITION;DECLARECONTINUE HANDLER FORNOT FOUND SET done =1;OPEN cur1;
REPEAT
FETCH cur1 INTO col;IFNOT done THENset res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);ENDIF;
UNTIL done END REPEAT;CLOSE cur1;RETURN res;
Hasil Anda mengembalikan string yang dibatasi koma, misalnya ...
Ini akan sangat lambat untuk setiap tabel berukuran sedang.
Joel
3
Saya setuju bahwa itu tidak cukup untuk Select *, jika yang Anda tidak perlu, seperti yang disebutkan di tempat lain, adalah Gumpalan, Anda tidak ingin memiliki overhead merayap masuk
Saya akan membuat tampilan dengan data yang diperlukan, maka Anda dapat Select *dengan nyaman - jika perangkat lunak database mendukungnya. Lain, letakkan data besar di tabel lain.
Pada awalnya saya pikir Anda bisa menggunakan ekspresi reguler, tetapi karena saya sudah membaca dokumen MYSQL sepertinya Anda tidak bisa. Jika saya adalah Anda, saya akan menggunakan bahasa lain (seperti PHP) untuk menghasilkan daftar kolom yang ingin Anda dapatkan, simpan sebagai string dan kemudian gunakan itu untuk menghasilkan SQL.
Saya setuju dengan jawaban @ Mahomedalid, tetapi saya tidak ingin melakukan sesuatu seperti pernyataan yang disiapkan dan saya tidak ingin mengetik semua kolom, jadi yang saya miliki adalah solusi konyol.
Pergi ke tabel di phpmyadmin-> sql-> pilih, itu dump kueri: salin, ganti dan selesai! :)
Meskipun saya setuju dengan jawaban Thomas (+1;)), saya ingin menambahkan peringatan bahwa saya akan menganggap kolom yang tidak Anda inginkan berisi hampir tidak ada data. Jika itu berisi sejumlah besar teks, xml atau gumpalan biner, maka luangkan waktu untuk memilih setiap kolom satu per satu. Performa Anda akan menderita sebaliknya. Bersulang!
Jawaban yang diposting oleh Mahomedalid memiliki masalah kecil:
Di dalam kode fungsi pengganti diganti " <columns_to_delete>," oleh "", penggantian ini memiliki masalah jika bidang yang diganti adalah yang terakhir di string concat karena yang terakhir tidak memiliki karakter koma "," dan tidak dihapus dari string.
Lamaran ku:
SET@sql = CONCAT('SELECT ',(SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),'<columns_to_delete>','\'FIELD_REMOVED\'')FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='<table>'AND TABLE_SCHEMA ='<database>'),' FROM <table>');
Mengganti <table>, <database>dan `
Kolom yang dihapus diganti dengan string "FIELD_REMOVED" dalam kasus saya ini berfungsi karena saya mencoba untuk menyimpan memori. (Bidang yang saya hapus adalah Gumpalan sekitar 1MB)
Mungkin saya punya solusi untuk perbedaan Jan Koritak yang ditunjukkan
SELECT CONCAT('SELECT ',(SELECT GROUP_CONCAT(t.col)FROM(SELECTCASEWHEN COLUMN_NAME ='eid'THENNULLELSE COLUMN_NAME
ENDAS col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='employee'AND TABLE_SCHEMA ='test') t
WHERE t.col ISNOTNULL),' FROM employee');
Meja :
SELECT table_name,column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='employee'AND TABLE_SCHEMA ='test'
================================
table_name column_name
employee eid
employee name_eid
employee sal
Anda dapat menggunakan SQL untuk menghasilkan SQL jika Anda suka dan mengevaluasi SQL yang dihasilkannya. Ini adalah solusi umum karena mengekstrak nama kolom dari skema informasi. Berikut adalah contoh dari baris perintah Unix.
Mengganti
MYSQL dengan perintah mysql Anda
TABEL dengan nama tabel
EXCLUDEDFIELD dengan nama bidang yang dikecualikan
echo $(echo 'select concat("select ", group_concat(column_name) , " from TABLE") from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"'| MYSQL | tail -n 1)| MYSQL
Anda benar-benar hanya perlu mengekstrak nama kolom dengan cara ini hanya sekali untuk membuat daftar kolom mengecualikan kolom itu, dan kemudian hanya menggunakan kueri yang telah Anda buat.
Jadi sesuatu seperti:
column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"'| MYSQL | tail -n 1)
Sekarang Anda dapat menggunakan kembali $column_liststring dalam kueri yang Anda buat.
Saya ingin menambahkan sudut pandang lain untuk menyelesaikan masalah ini, khususnya jika Anda memiliki sejumlah kecil kolom untuk dihapus.
Anda bisa menggunakan alat DB seperti MySQL Workbench untuk menghasilkan pernyataan pilih untuk Anda, jadi Anda hanya perlu menghapus kolom-kolom tersebut untuk pernyataan yang dibuat dan menyalinnya ke skrip SQL Anda.
Di MySQL Workbench cara untuk menghasilkannya adalah:
Klik kanan pada tabel -> kirim ke Sql Editor -> Pilih Semua Pernyataan.
Jawaban yang diterima memiliki beberapa kekurangan.
Gagal di mana nama tabel atau kolom memerlukan backticks
Gagal jika kolom yang ingin Anda hilangkan adalah yang terakhir dalam daftar
Ini membutuhkan daftar nama tabel dua kali (sekali untuk pilih dan yang lainnya untuk teks kueri) yang berlebihan dan tidak perlu
Ini berpotensi dapat mengembalikan nama kolom dalam urutan yang salah
Semua masalah ini dapat diatasi dengan hanya memasukkan backticks di SEPARATORuntuk Anda GROUP_CONCATdan menggunakan WHEREkondisi alih-alih REPLACE(). Untuk tujuan saya (dan saya bayangkan banyak orang lain), saya ingin nama kolom dikembalikan dalam urutan yang sama dengan yang muncul di tabel itu sendiri. Untuk mencapai ini, di sini kita menggunakan ORDER BYklausa eksplisit di dalam GROUP_CONCAT()fungsi:
Saya sangat terlambat dalam mengeluarkan jawaban untuk ini, katakanlah ini adalah cara saya selalu melakukannya dan terus terang, ini 100 kali lebih baik dan lebih rapi daripada jawaban terbaik, saya hanya berharap seseorang akan melihatnya. Dan menemukannya bermanfaat
//create an array, we will call it here.$here = array();//create an SQL query inorderto get allof the column names
$SQL ="SHOW COLUMNS FROM Table";//put allof the column names in the array
foreach($conn->query($SQL)as$row){$here[]=$row[0];}//now search through the array containing the column names for the name of the column,in this case i used the common ID field as an example
$key= array_search('ID',$here);//now delete the entry
unset($here[$key]);
Mungkin rapi, tetapi tidak menjawab pertanyaan: dia belum bertanya tentang php, dan Anda tidak memberikan pernyataan pilih atau hasil dari apa yang dia inginkan, tetapi hanya array php yang berisi kolom yang dia inginkan.
gou1
2
–1. Ini bukan kode SQL, dan tidak ada SELECTpernyataan di sini — kata itu bahkan tidak muncul sekali.
Frungi
Ini hanya lebih rapi sejauh (a) Anda lebih nyaman dengan PHP daripada SQL, atau (b) Anda suka menyebarkan kode Anda ke beberapa baris agar mudah dibaca. Saya akan mengakui poin (b). Pendekatan Anda juga akan kurang berkinerja, meskipun perbedaannya akan kecil dalam banyak kasus penggunaan. Lihat juga komentar lain tentang pertanyaan Anda. Tidak layak diteriaki, jadi sarankan Anda menghapus komentar yang tidak pantas dari pertanyaan awal.
mc0e
-5
Pilih * adalah antipattern SQL. Seharusnya tidak digunakan dalam kode produksi karena berbagai alasan termasuk:
Dibutuhkan sedikit lebih lama untuk diproses. Ketika berbagai hal dijalankan jutaan kali, bagian-bagian kecil itu bisa berarti. Basis data yang lambat di mana kelambatan disebabkan oleh jenis pengkodean yang ceroboh ini adalah jenis yang paling sulit untuk digunakan.
Ini berarti Anda mungkin mengirim lebih banyak data daripada yang Anda butuhkan yang menyebabkan kemacetan server dan jaringan. Jika Anda memiliki gabungan dalam, kemungkinan mengirim lebih banyak data daripada yang Anda butuhkan adalah 100%.
Ini menyebabkan masalah pemeliharaan terutama ketika Anda telah menambahkan kolom baru yang tidak ingin Anda lihat di mana-mana. Lebih lanjut jika Anda memiliki kolom baru, Anda mungkin perlu melakukan sesuatu pada antarmuka untuk menentukan apa yang harus dilakukan dengan kolom itu.
Itu dapat merusak pandangan (saya tahu ini benar di server SQl, mungkin atau mungkin tidak benar di mysql).
Jika seseorang cukup konyol untuk membangun kembali tabel dengan kolom dalam urutan yang berbeda (yang seharusnya tidak Anda lakukan tetapi itu terjadi sepanjang waktu), semua jenis kode dapat rusak. Terutama kode untuk menyisipkan misalnya di mana tiba-tiba Anda meletakkan kota ke dalam bidang address_3 karena tanpa menentukan, database hanya dapat berjalan sesuai urutan kolom. Ini cukup buruk ketika tipe data berubah tetapi lebih buruk ketika kolom bertukar memiliki tipe data yang sama karena Anda dapat pergi untuk kadang-kadang memasukkan data buruk yang berantakan untuk dibersihkan. Anda perlu peduli dengan integritas data.
Jika digunakan dalam sisipan, itu akan mematahkan sisipan jika kolom baru ditambahkan dalam satu tabel tetapi tidak yang lain.
Mungkin mematahkan pemicu. Masalah pemicu bisa sulit didiagnosis.
Tambahkan semua ini terhadap waktu yang diperlukan untuk menambahkan nama kolom (heck Anda bahkan mungkin memiliki antarmuka yang memungkinkan Anda untuk menyeret nama kolom (saya tahu saya lakukan di SQL Server, saya yakin ada beberapa cara untuk lakukan ini adalah beberapa alat yang Anda gunakan untuk menulis pertanyaan mysql.) Mari kita lihat, "Saya dapat menyebabkan masalah pemeliharaan, saya dapat menyebabkan masalah kinerja dan saya dapat menyebabkan masalah integritas data, tapi hei saya menghemat waktu dev selama lima menit." di kolom spesifik yang Anda inginkan.
Jawaban:
Sebenarnya ada cara, Anda harus memiliki izin untuk melakukan ini ...
Mengganti
<table>, <database> and <columns_to_omit>
sumber
<column_name>
Dalam definisi mysql (manual) tidak ada hal seperti itu. Tetapi jika Anda memiliki jumlah kolom yang sangat besar
col1
, ...,,col100
berikut ini dapat bermanfaat:sumber
DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb);
jika tidak, ia disimpan ke disk secara default, dan selamat dari server restart. ( terima kasih )Apakah tampilan bekerja lebih baik dalam kasus ini?
sumber
Anda dapat melakukan:
tanpa mendapatkan kolom3, meskipun mungkin Anda mencari solusi yang lebih umum?
sumber
Jika Anda mencari untuk mengecualikan nilai bidang, misalnya untuk masalah keamanan / info sensitif, Anda dapat mengambil kolom itu sebagai nol.
misalnya
sumber
salary
kolom kedua . Tapi karena itu diambil setelah *, itu menimpa yang asli. Itu tidak cantik, tetapi itu berhasil.Sejauh pengetahuan saya, tidak ada. Anda dapat melakukan sesuatu seperti:
dan secara manual pilih kolom yang Anda inginkan. Namun, jika Anda ingin banyak kolom, maka Anda mungkin hanya ingin melakukan:
dan abaikan saja apa yang tidak Anda inginkan.
Dalam kasus khusus Anda, saya akan menyarankan:
kecuali Anda hanya ingin beberapa kolom. Jika Anda hanya ingin empat kolom, maka:
akan baik-baik saja, tetapi jika Anda menginginkan 50 kolom, maka setiap kode yang membuat kueri akan menjadi (juga?) sulit dibaca.
sumber
Saat mencoba solusi oleh @Mahomedalid dan @Junaid saya menemukan masalah. Jadi terpikir untuk membagikannya. Jika nama kolom memiliki spasi atau tanda hubung seperti check-in maka kueri akan gagal. Solusi sederhana adalah dengan menggunakan backtick di sekitar nama kolom. Kueri yang dimodifikasi ada di bawah
sumber
Jika kolom yang tidak ingin Anda pilih memiliki sejumlah besar data di dalamnya, dan Anda tidak ingin memasukkannya karena masalah kecepatan dan Anda sering memilih kolom lainnya, saya sarankan Anda membuat tabel baru dengan satu bidang yang biasanya tidak Anda pilih dengan kunci ke tabel asli dan hapus bidang dari tabel asli. Bergabunglah dengan tabel ketika bidang ekstra itu benar-benar diperlukan.
sumber
Anda bisa menggunakan DESCRIBE my_table dan menggunakan hasilnya untuk menghasilkan pernyataan SELECT secara dinamis.
sumber
Masalah utama saya adalah banyak kolom yang saya dapatkan ketika bergabung dengan tabel. Meskipun ini bukan jawaban untuk pertanyaan Anda (cara memilih semua kecuali kolom tertentu dari satu tabel), saya pikir perlu disebutkan bahwa Anda dapat menentukan untuk mendapatkan semua kolom dari tabel tertentu, bukan hanya menentukan .
table.
Berikut adalah contoh bagaimana ini bisa sangat berguna:
Hasilnya adalah semua kolom dari tabel pengguna, dan dua kolom tambahan yang digabungkan dari tabel meta.
sumber
Saya menyukai jawaban dari
@Mahomedalid
selain fakta ini diinformasikan dalam komentar dari@Bill Karwin
. Kemungkinan masalah yang diangkat@Jan Koritak
adalah benar saya menghadapi itu, tetapi saya telah menemukan trik untuk itu dan hanya ingin membagikannya di sini untuk siapa saja yang menghadapi masalah.kita bisa mengganti fungsi REPLACE dengan klausa tempat dalam sub-kueri pernyataan Disiapkan seperti ini:
Menggunakan nama tabel dan kolom saya
Jadi, ini akan mengecualikan hanya bidang
id
tetapi tidakcompany_id
sumber
Merupakan praktik yang baik untuk menentukan kolom yang Anda tanyakan bahkan jika Anda menanyakan semua kolom.
Jadi saya sarankan Anda menulis nama setiap kolom dalam pernyataan (tidak termasuk yang tidak Anda inginkan).
sumber
Kerjakan saja
Lalu taruh kolom di bahasa pemrograman favorit Anda: php
sumber
Saya setuju dengan solusi "sederhana" untuk mendaftarkan semua kolom, tetapi ini bisa memberatkan, dan kesalahan ketik dapat menyebabkan banyak waktu terbuang. Saya menggunakan fungsi "getTableColumns" untuk mengambil nama-nama kolom saya yang cocok untuk menempel ke kueri. Maka yang perlu saya lakukan adalah menghapus yang tidak saya inginkan.
Hasil Anda mengembalikan string yang dibatasi koma, misalnya ...
sumber
Ya, meskipun bisa I / O tinggi tergantung pada tabel di sini adalah solusi yang saya temukan untuk itu.
sumber
Saya setuju bahwa itu tidak cukup untuk
Select *
, jika yang Anda tidak perlu, seperti yang disebutkan di tempat lain, adalah Gumpalan, Anda tidak ingin memiliki overhead merayap masukSaya akan membuat tampilan dengan data yang diperlukan, maka Anda dapat
Select *
dengan nyaman - jika perangkat lunak database mendukungnya. Lain, letakkan data besar di tabel lain.sumber
Pada awalnya saya pikir Anda bisa menggunakan ekspresi reguler, tetapi karena saya sudah membaca dokumen MYSQL sepertinya Anda tidak bisa. Jika saya adalah Anda, saya akan menggunakan bahasa lain (seperti PHP) untuk menghasilkan daftar kolom yang ingin Anda dapatkan, simpan sebagai string dan kemudian gunakan itu untuk menghasilkan SQL.
sumber
Saya ingin ini juga jadi saya membuat fungsi sebagai gantinya.
Jadi cara kerjanya adalah Anda memasukkan tabel, lalu kolom yang tidak Anda inginkan atau seperti dalam array: array ("id", "name", "whatevercolumn")
Jadi di pilih Anda bisa menggunakannya seperti ini:
atau
sumber
Saya setuju dengan jawaban @ Mahomedalid, tetapi saya tidak ingin melakukan sesuatu seperti pernyataan yang disiapkan dan saya tidak ingin mengetik semua kolom, jadi yang saya miliki adalah solusi konyol.
Pergi ke tabel di phpmyadmin-> sql-> pilih, itu dump kueri: salin, ganti dan selesai! :)
sumber
Meskipun saya setuju dengan jawaban Thomas (+1;)), saya ingin menambahkan peringatan bahwa saya akan menganggap kolom yang tidak Anda inginkan berisi hampir tidak ada data. Jika itu berisi sejumlah besar teks, xml atau gumpalan biner, maka luangkan waktu untuk memilih setiap kolom satu per satu. Performa Anda akan menderita sebaliknya. Bersulang!
sumber
Jawaban yang diposting oleh Mahomedalid memiliki masalah kecil:
Di dalam kode fungsi pengganti diganti "
<columns_to_delete>,
" oleh "", penggantian ini memiliki masalah jika bidang yang diganti adalah yang terakhir di string concat karena yang terakhir tidak memiliki karakter koma "," dan tidak dihapus dari string.Lamaran ku:
Mengganti
<table>
,<database>
dan `Kolom yang dihapus diganti dengan string "FIELD_REMOVED" dalam kasus saya ini berfungsi karena saya mencoba untuk menyimpan memori. (Bidang yang saya hapus adalah Gumpalan sekitar 1MB)
sumber
Berdasarkan jawaban @Mahomedalid, saya telah melakukan beberapa perbaikan untuk mendukung "pilih semua kolom kecuali beberapa di mysql"
Jika Anda memiliki banyak cols, gunakan sql ini untuk mengubah group_concat_max_len
sumber
Mungkin saya punya solusi untuk perbedaan Jan Koritak yang ditunjukkan
Meja :
================================
================================
Hasil Permintaan:
sumber
Jika selalu satu kolom yang sama, maka Anda dapat membuat tampilan yang tidak ada di dalamnya.
Kalau tidak, tidak, kurasa tidak.
sumber
Anda dapat menggunakan SQL untuk menghasilkan SQL jika Anda suka dan mengevaluasi SQL yang dihasilkannya. Ini adalah solusi umum karena mengekstrak nama kolom dari skema informasi. Berikut adalah contoh dari baris perintah Unix.
Mengganti
Anda benar-benar hanya perlu mengekstrak nama kolom dengan cara ini hanya sekali untuk membuat daftar kolom mengecualikan kolom itu, dan kemudian hanya menggunakan kueri yang telah Anda buat.
Jadi sesuatu seperti:
Sekarang Anda dapat menggunakan kembali
$column_list
string dalam kueri yang Anda buat.sumber
Saya ingin menambahkan sudut pandang lain untuk menyelesaikan masalah ini, khususnya jika Anda memiliki sejumlah kecil kolom untuk dihapus.
Anda bisa menggunakan alat DB seperti MySQL Workbench untuk menghasilkan pernyataan pilih untuk Anda, jadi Anda hanya perlu menghapus kolom-kolom tersebut untuk pernyataan yang dibuat dan menyalinnya ke skrip SQL Anda.
Di MySQL Workbench cara untuk menghasilkannya adalah:
Klik kanan pada tabel -> kirim ke Sql Editor -> Pilih Semua Pernyataan.
sumber
Jawaban yang diterima memiliki beberapa kekurangan.
Semua masalah ini dapat diatasi dengan hanya memasukkan backticks di
SEPARATOR
untuk AndaGROUP_CONCAT
dan menggunakanWHERE
kondisi alih-alihREPLACE()
. Untuk tujuan saya (dan saya bayangkan banyak orang lain), saya ingin nama kolom dikembalikan dalam urutan yang sama dengan yang muncul di tabel itu sendiri. Untuk mencapai ini, di sini kita menggunakanORDER BY
klausa eksplisit di dalamGROUP_CONCAT()
fungsi:sumber
Saya punya saran tetapi bukan solusi. Jika beberapa kolom Anda memiliki kumpulan data yang lebih besar maka Anda harus mencoba dengan mengikuti
sumber
Saya sangat terlambat dalam mengeluarkan jawaban untuk ini, katakanlah ini adalah cara saya selalu melakukannya dan terus terang, ini 100 kali lebih baik dan lebih rapi daripada jawaban terbaik, saya hanya berharap seseorang akan melihatnya. Dan menemukannya bermanfaat
sumber
SELECT
pernyataan di sini — kata itu bahkan tidak muncul sekali.Pilih * adalah antipattern SQL. Seharusnya tidak digunakan dalam kode produksi karena berbagai alasan termasuk:
Dibutuhkan sedikit lebih lama untuk diproses. Ketika berbagai hal dijalankan jutaan kali, bagian-bagian kecil itu bisa berarti. Basis data yang lambat di mana kelambatan disebabkan oleh jenis pengkodean yang ceroboh ini adalah jenis yang paling sulit untuk digunakan.
Ini berarti Anda mungkin mengirim lebih banyak data daripada yang Anda butuhkan yang menyebabkan kemacetan server dan jaringan. Jika Anda memiliki gabungan dalam, kemungkinan mengirim lebih banyak data daripada yang Anda butuhkan adalah 100%.
Ini menyebabkan masalah pemeliharaan terutama ketika Anda telah menambahkan kolom baru yang tidak ingin Anda lihat di mana-mana. Lebih lanjut jika Anda memiliki kolom baru, Anda mungkin perlu melakukan sesuatu pada antarmuka untuk menentukan apa yang harus dilakukan dengan kolom itu.
Itu dapat merusak pandangan (saya tahu ini benar di server SQl, mungkin atau mungkin tidak benar di mysql).
Jika seseorang cukup konyol untuk membangun kembali tabel dengan kolom dalam urutan yang berbeda (yang seharusnya tidak Anda lakukan tetapi itu terjadi sepanjang waktu), semua jenis kode dapat rusak. Terutama kode untuk menyisipkan misalnya di mana tiba-tiba Anda meletakkan kota ke dalam bidang address_3 karena tanpa menentukan, database hanya dapat berjalan sesuai urutan kolom. Ini cukup buruk ketika tipe data berubah tetapi lebih buruk ketika kolom bertukar memiliki tipe data yang sama karena Anda dapat pergi untuk kadang-kadang memasukkan data buruk yang berantakan untuk dibersihkan. Anda perlu peduli dengan integritas data.
Jika digunakan dalam sisipan, itu akan mematahkan sisipan jika kolom baru ditambahkan dalam satu tabel tetapi tidak yang lain.
Mungkin mematahkan pemicu. Masalah pemicu bisa sulit didiagnosis.
Tambahkan semua ini terhadap waktu yang diperlukan untuk menambahkan nama kolom (heck Anda bahkan mungkin memiliki antarmuka yang memungkinkan Anda untuk menyeret nama kolom (saya tahu saya lakukan di SQL Server, saya yakin ada beberapa cara untuk lakukan ini adalah beberapa alat yang Anda gunakan untuk menulis pertanyaan mysql.) Mari kita lihat, "Saya dapat menyebabkan masalah pemeliharaan, saya dapat menyebabkan masalah kinerja dan saya dapat menyebabkan masalah integritas data, tapi hei saya menghemat waktu dev selama lima menit." di kolom spesifik yang Anda inginkan.
Saya juga menyarankan Anda membaca buku ini: http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers-ebook/dp/B00A376BB2/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1389896688&sr=1- 1 & kata kunci = sql + antipatterns
sumber