mysql อัปเดตหลายคอลัมน์ด้วยตอนนี้ ()


88

ฉันต้องการอัปเดต 2 คอลัมน์วันที่และเวลาและฉันต้องการให้มันเหมือนกันทุกประการโดยใช้ mysql เวอร์ชัน 4.1.20 ฉันใช้แบบสอบถามนี้:

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

มันมีความปลอดภัยหรือมีโอกาสที่คอลัมน์ที่มีการอัปเดตด้วยเวลาที่แตกต่างกันเพราะการมองเห็นสาย 2 ไปnow()?
ฉันไม่คิดว่าจะสามารถอัปเดตด้วยค่าที่แตกต่างกันได้ (ฉันคิดว่าการโทรภายใน mysql now()เพียงครั้งเดียวต่อแถวหรือสิ่งที่คล้ายกัน) แต่ฉันไม่ใช่ผู้เชี่ยวชาญคุณคิดอย่างไร?

ปรับปรุง: คำถามที่สองถูกสกัดที่นี่


1
ฉันขอแนะนำให้คุณลบคำถามที่สองของคุณออกจากที่นี่และในที่สุดก็โพสต์ใหม่ในโพสต์แยกต่างหาก
Cœur

คำตอบ:


145

พบวิธีแก้ไข:

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

ฉันพบสิ่งนี้ใน MySQL Docs และหลังจากการทดสอบสองสามครั้งมันใช้งานได้:

คำสั่งต่อไปนี้ตั้งค่า col2 เป็นค่า col1 ปัจจุบัน (อัพเดต) ไม่ใช่ค่า col1 ดั้งเดิม ผลลัพธ์คือ col1 และ col2 มีค่าเท่ากัน ลักษณะการทำงานนี้แตกต่างจาก SQL มาตรฐาน

อัปเดต t1 SET col1 = col1 + 1, col2 = col1;


มีวิธีใดบ้างที่จะไม่ได้ผล? ในขั้นตอนหรือใช้การเข้าร่วมกับตารางชั่วคราว?
Soheil Rahsaz

7

Mysql ไม่ฉลาดมาก เมื่อคุณต้องการใช้การประทับเวลาเดียวกันในการอัปเดตหลายรายการหรือแทรกคิวรีคุณต้องประกาศตัวแปร

เมื่อคุณใช้now()ฟังก์ชันนี้ระบบจะเรียกการประทับเวลาปัจจุบันทุกครั้งที่คุณเรียกใช้ในแบบสอบถามอื่น


5

MySQL จะประเมินตอนนี้ () หนึ่งครั้งต่อหนึ่งคำสั่งเมื่อคำสั่งเริ่มดำเนินการ ดังนั้นจึงปลอดภัยที่จะมีการเรียกใช้ในขณะนี้ () หลายครั้งต่อหนึ่งคำสั่ง

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)

1

คุณสามารถเก็บค่าของ now () ไว้ในตัวแปรก่อนที่จะรันคิวรีอัพเดตจากนั้นใช้ตัวแปรนั้นเพื่ออัปเดตทั้งฟิลด์last_updateและlast_monitorและ

สิ่งนี้จะช่วยให้มั่นใจได้ว่า now () ถูกดำเนินการเพียงครั้งเดียวและมีการอัปเดตค่าเดียวกันในทั้งสองคอลัมน์ที่คุณต้องการ


1

คุณสามารถใส่รหัสต่อไปนี้ในค่าเริ่มต้นของคอลัมน์การประทับเวลา: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPดังนั้นในการอัปเดตคอลัมน์ทั้งสองจะใช้ค่าเดียวกัน


1
AFAIK "on update" มีขีด จำกัด หนึ่งคอลัมน์ต่อตารางดังนั้นจึงไม่สามารถตั้งค่าเป็นทั้งสองคอลัมน์ได้
Radu Maris

0

หากคุณต้องการให้แน่ใจว่าnow()มีค่าเท่ากันคุณสามารถเรียกใช้สองแบบสอบถามได้ (ซึ่งจะตอบคำถามที่สองของคุณด้วยในกรณีนี้คุณจะถามupdate last_monitor = to last_updateแต่last_updateยังไม่ได้รับการอัปเดต)

คุณสามารถทำสิ่งที่ชอบ:

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

อย่างไรก็ตามฉันคิดว่า mysql ฉลาดพอที่จะขอnow()เพียงครั้งเดียวต่อหนึ่งแบบสอบถาม


การอัปเดตทั้งสองเป็นอย่างไร คุณเดาว่า mysql ฉลาดพอที่จะรวมเป็นคำสั่งเดียวหรือไม่? เพราะมันเคยชิน
Rafael Herscovici

0

มี 2 ​​วิธีในการนี้

ก่อนอื่นฉันขอแนะนำให้คุณประกาศ now () เป็นตัวแปรก่อนที่จะฉีดเข้าไปในคำสั่ง sql ช่วยพูด;

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

ในทางตรรกะหากคุณต้องการอินพุตอื่นสำหรับ last_monitor คุณจะเพิ่มตัวแปรอื่นเช่น;

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

ด้วยวิธีนี้คุณสามารถใช้ตัวแปรกี่ครั้งก็ได้ไม่เพียง แต่ในคำสั่ง mysql เท่านั้น แต่ยังใช้ในภาษาสคริปต์ฝั่งเซิร์ฟเวอร์ (เช่น PHP) ที่คุณใช้ในโครงการของคุณ โปรดจำไว้ว่าตัวแปรเดียวกันนี้สามารถแทรกเป็นอินพุตในรูปแบบที่ส่วนหน้าของแอปพลิเคชัน นั่นทำให้โครงการมีพลวัตและไม่คงที่

ประการที่สองถ้า now () ระบุเวลาของการอัปเดตจากนั้นใช้ mysql คุณสามารถกำหนดคุณสมบัติของแถวเป็นเวลาประทับได้ ทุกครั้งที่แทรกแถวหรืออัปเดตเวลาด้วย


ยินดีต้อนรับสู่ SO แม้ว่านี่จะเป็นวิธีแก้ปัญหา แต่ก็ไม่ได้ตอบคำถามซึ่งก็คือ "มีปัญหาในการใช้ฟังก์ชัน NOW () ในตัว mysql หรือไม่" นอกจากนี้คุณแนะนำให้ใช้ภาษาภายนอกซึ่งผู้โพสต์อาจไม่สามารถควบคุมได้ คำแนะนำที่ 2 ของคุณฉันไม่แน่ใจ (การจำ mysql ของฉันไม่ได้มีรายละเอียดขนาดนั้น) แต่การสนับสนุนด้วยลิงก์ไปยังเอกสาร / ตัวอย่างบางส่วนจะให้ความน่าเชื่อถือมากกว่า
Martin

ในคำแนะนำที่ 2 ของฉันถ้าตอนนี้ () จะใช้เป็นเวลาประทับเมื่อใดก็ตามที่มีการอัปเดตลิงก์ต่อไปนี้สามารถช่วยได้ alvinalexander.com/mysql/… ในคำแนะนำที่ 1 ของฉันแต่ละคอลัมน์ในตาราง mysql เป็นอิสระ ดังนั้นการป้อนข้อมูล (เช่นการใช้ตัวแปรเดียวในคำถามด้านบน) จึงทำได้โดยอิสระ อย่างไรก็ตามคุณสามารถเปรียบเทียบและเปรียบเทียบข้อมูลในคอลัมน์ต่างๆได้โดยใช้ตัวดำเนินการเช่น>, <, =,! =,! <. นั่นหมายความว่าคุณไม่สามารถป้อนข้อมูลลงใน cols เช่นนี้ได้ mysql> อัพเดตชุดตาราง last_update = last_monitor = now () โดยที่ id = 1;
Wahinya Brian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.