mysql memperbarui beberapa kolom dengan yang sama sekarang ()

88

Saya perlu memperbarui 2 kolom datetime, dan saya membutuhkannya persis sama, menggunakan mysql versi 4.1.20. Saya menggunakan kueri ini:

mysql> update table set last_update=now(), last_monitor=now() where id=1;

Aman atau ada kemungkinan kolom diperbarui dengan waktu yang berbeda, karena 2 panggilan yang terlihat ke now()?
Saya tidak berpikir bahwa itu dapat diperbarui dengan nilai yang berbeda (saya pikir secara internal panggilan mysql now()hanya sekali per baris atau yang serupa), tetapi saya bukan seorang ahli, bagaimana menurut Anda?

Pembaruan: Pertanyaan kedua diekstraksi di sini .

Radu Maris
sumber
1
Saya sarankan Anda menghapus pertanyaan kedua Anda dari sini, dan akhirnya memposting ulang di pos terpisah.
Cœur

Jawaban:

145

Menemukan solusi:

mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;

Saya menemukan ini di MySQL Docs dan setelah beberapa tes berhasil:

pernyataan berikut menetapkan col2 ke nilai col1 saat ini (diperbarui), bukan nilai col1 asli. Hasilnya adalah col1 dan col2 memiliki nilai yang sama. Perilaku ini berbeda dari SQL standar.

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

Radu Maris
sumber
Adakah cara agar ini tidak berhasil? Dalam prosedur atau menggunakan tabel gabungan dengan temp?
Soheil Rahsaz
7

Mysql tidak terlalu pintar. Saat Anda ingin menggunakan stempel waktu yang sama di beberapa pembaruan atau menyisipkan kueri, Anda perlu mendeklarasikan variabel.

Saat Anda menggunakan now()fungsi tersebut, sistem akan memanggil stempel waktu saat ini setiap kali Anda memanggilnya di kueri lain.

Olivier
sumber
5

MySQL mengevaluasi now () satu kali per pernyataan saat pernyataan tersebut memulai eksekusi. Jadi aman untuk memiliki beberapa panggilan now () yang terlihat per pernyataan.

select now(); select now(), sleep(10), now(); select now();
+---------------------+
| now()               |
+---------------------+
| 2018-11-05 16:54:00 |
+---------------------+
1 row in set (0.00 sec)

+---------------------+-----------+---------------------+
| now()               | sleep(10) | now()               |
+---------------------+-----------+---------------------+
| 2018-11-05 16:54:00 |         0 | 2018-11-05 16:54:00 |
+---------------------+-----------+---------------------+
1 row in set (10.00 sec)

+---------------------+
| now()               |
+---------------------+
| 2018-11-05 16:54:10 |
+---------------------+
1 row in set (0.00 sec)
Andrews yang kaya
sumber
1

Anda bisa menyimpan nilai now () dalam variabel sebelum menjalankan kueri pembaruan dan kemudian menggunakan variabel tersebut untuk memperbarui bidang last_updatedan last_monitor.

Ini akan memastikan now () dijalankan hanya sekali dan nilai yang sama diperbarui pada kedua kolom yang Anda butuhkan.

Sachin Shanbhag
sumber
1

Anda dapat meletakkan kode berikut pada nilai default kolom timestamp:, CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPjadi pada update kedua kolom tersebut mengambil nilai yang sama.

Danny
sumber
1
AFAIK "saat diperbarui" memiliki batas satu kolom per tabel, jadi tidak dapat menyetelnya ke kedua kolom.
Radu Maris
0

Jika Anda benar-benar perlu memastikan bahwa now()memiliki nilai yang sama, Anda dapat menjalankan dua kueri (yang akan menjawab pertanyaan kedua Anda juga, dalam hal ini Anda meminta update last_monitor = to last_updatetetapi last_updatebelum diperbarui)

Anda bisa melakukan sesuatu seperti:

mysql> update table set last_update=now() where id=1;
mysql> update table set last_monitor = last_update where id=1;

Lagi pula saya pikir mysql cukup pintar untuk meminta now()hanya sekali per permintaan.

sathia
sumber
Bagaimana dengan dua pembaruan tersebut? apakah Anda juga menebak mysql cukup pintar untuk menggabungkannya menjadi satu pernyataan? karena tidak akan.
Rafael Herscovici
0

Ada 2 cara untuk ini;

Pertama , saya akan menyarankan Anda mendeklarasikan now () sebagai variabel sebelum memasukkannya ke dalam pernyataan sql. Katakanlah;

var x = now();
mysql> UPDATE table SET last_update=$x, last_monitor=$x WHERE id=1;

Logikanya jika Anda menginginkan input yang berbeda untuk last_monitor maka Anda akan menambahkan variabel lain seperti;

var y = time();
mysql> UPDATE table SET last_update=$x, last_monitor=$y WHERE id=1;

Dengan cara ini Anda dapat menggunakan variabel sebanyak yang Anda bisa, tidak hanya dalam pernyataan mysql tetapi juga dalam bahasa skrip sisi server (seperti PHP) yang Anda gunakan dalam proyek Anda. Ingat variabel yang sama ini dapat disisipkan sebagai masukan dalam formulir di bagian depan aplikasi. Itu membuat proyek menjadi dinamis dan tidak statis.

Kedua jika now () menunjukkan waktu pembaruan kemudian menggunakan mysql Anda dapat mendeklarasikan properti baris sebagai stempel waktu. Setiap kali baris dimasukkan atau diperbarui, waktu juga diperbarui.

Wahinya Brian
sumber
Selamat datang di SO. Meskipun ini adalah solusi untuk masalah tersebut, ini tidak benar-benar menjawab pertanyaan yaitu "Apakah ada masalah menggunakan fungsi mysql built-in NOW ()?". Anda juga menyarankan menggunakan bahasa eksternal yang mungkin tidak dapat dikontrol oleh poster. Saran kedua Anda, saya tidak yakin (ingatan saya tentang mysql tidak begitu rinci) tetapi mendukungnya dengan tautan ke beberapa dokumen / contoh akan memberikan kredibilitas yang jauh lebih besar.
Martin
Dalam saran saya yang kedua, jika now () akan digunakan sebagai stempel waktu setiap kali pembaruan terjadi, tautan berikut dapat membantu; alvinalexander.com/mysql/… Dalam saran pertama saya, setiap kolom dalam tabel mysql adalah independen. Karenanya input data (seperti menggunakan satu variabel dalam pertanyaan di atas) dilakukan secara mandiri. Namun Anda dapat membandingkan dan membedakan data di kolom yang berbeda menggunakan operator seperti>, <, =,! = ,! <. Ini berarti Anda tidak dapat memasukkan data ke kolom seperti ini; mysql> perbarui tabel set last_update = last_monitor = now () di mana id = 1;
Wahinya Brian