mysql şimdi aynı olan birden çok sütunu güncelle ()


88

2 datetime sütununu güncellemem gerekiyor ve mysql 4.1.20 sürümünü kullanarak bunların tamamen aynı olmasına ihtiyacım var. Bu sorguyu kullanıyorum:

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

Güvenli veya now()? 'A görünen 2 çağrı nedeniyle sütunların farklı zamanlarda güncellenme ihtimali var mı?
Farklı değerlerle güncellenebileceğini sanmıyorum (dahili olarak mysql çağrıları now()satır başına bir kez veya benzer bir şey düşünüyorum ), ama ben bir uzman değilim, ne düşünüyorsunuz?

Güncelleme: İkinci soru buradan çıkarıldı .


1
İkinci sorunuzu buradan kaldırmanızı ve sonunda ayrı bir gönderide tekrar göndermenizi öneririm.
Cœur

Yanıtlar:


145

Bir çözüm buldum:

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

Bulduğum bu MySQL Dokümanlar ve işe yarıyor birkaç testlerden sonra:

aşağıdaki ifade col2'yi orijinal col1 değerine değil, geçerli (güncellenmiş) col1 değerine ayarlar. Sonuç, col1 ve col2'nin aynı değere sahip olmasıdır. Bu davranış, standart SQL'den farklıdır.

GÜNCELLEME t1 SET col1 = col1 + 1, col2 = col1;


Bunun işe yaramamasının bir yolu var mı? Bir prosedürde mi yoksa geçici tablolarla birleştirme mi kullanıyorsunuz?
Soheil Rahsaz

7

Mysql pek akıllı değil. Birden çok güncellemede aynı zaman damgasını kullanmak veya sorgu eklemek istediğinizde, bir değişken belirtmeniz gerekir.

now()İşlevi kullandığınızda, sistem başka bir sorguda her çağırdığınızda geçerli zaman damgasını çağırır.


5

MySQL, ifade yürütmeye başladığında artık () deyimi başına bir kez değerlendirir. Bu nedenle, ifade başına birden fazla görünür now () çağrısı olması güvenlidir.

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

Güncelleştirme sorgusu çalıştırmadan önce bir değişkene () artık bir değerini depolamak ve daha sonra alanları hem güncellemek için bu değişkeni kullanabilirsiniz last_updateve last_monitor.

Bu, now () öğesinin yalnızca bir kez çalıştırılmasını ve aynı değerin ihtiyacınız olan her iki sütunda da güncellenmesini sağlar.


1

Aşağıdaki kodu zaman damgası sütununun varsayılan değerine koyabilirsiniz:, CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPbu nedenle güncelleme sırasında iki sütun aynı değeri alır.


1
AFAIK "güncelleme sırasında" tablo başına bir sütun sınırına sahiptir, bu nedenle her iki sütuna da ayarlanamaz.
Radu Maris

0

Bunun now()aynı değere sahip olduğundan gerçekten emin olmanız gerekiyorsa, iki sorgu çalıştırabilirsiniz (bu, ikinci sorunuza da cevap verecektir, bu durumda soruyorsunuz update last_monitor = to last_updateancak last_updatehenüz güncellenmedi)

şöyle bir şey yapabilirsin:

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

her neyse, mysql'in now()sorgu başına yalnızca bir kez soracak kadar akıllı olduğunu düşünüyorum .


İki güncellemeye ne dersiniz? mysql'in bunları tek bir ifadede birleştirecek kadar akıllı olduğunu da düşünüyor musunuz? çünkü olmayacak.
Rafael Herscovici

0

Bunun 2 yolu var;

Öncelikle , şimdi () 'yi sql ifadesine eklemeden önce bir değişken olarak tanımlamanızı tavsiye ederim. Diyelimki;

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

Last_monitor için farklı bir girdi istiyorsanız mantıksal olarak başka bir değişken ekleyeceksiniz;

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

Bu şekilde, değişkenleri olabildiğince çok kullanabilirsiniz, yalnızca mysql ifadelerinde değil, aynı zamanda projenizde kullandığınız sunucu tarafı kodlama dilinde (PHP gibi) da kullanabilirsiniz. Aynı değişkenlerin uygulamanın ön ucunda bir forma girdi olarak eklenebileceğini unutmayın. Bu, projeyi statik değil dinamik yapar.

İkinci olarak, eğer now () güncelleme zamanını gösteriyorsa, mysql kullanarak satırın özelliğini bir zaman damgası olarak kaldırabilirsiniz. Her satır eklendiğinde veya güncellendiğinde zaman da güncellenir.


SO'ya hoş geldiniz. Bu, soruna bir çözüm olsa da, "mysql yerleşik NOW () işlevini kullanırken bir sorun var mı?" Sorusuna gerçekten cevap vermiyor. Ayrıca, göndericinin üzerinde herhangi bir kontrolü olmayabileceği bir dış dil kullanmanızı önerirsiniz. 2. öneriniz emin değilim (mysql hakkındaki hatırlamam o kadar ayrıntılı değil) ama onu bazı dokümanlara / örneklere bağlantılarla desteklemek çok daha fazla güvenilirlik sağlayacaktır.
Martin

2. önerimde, eğer now () herhangi bir güncelleme gerçekleştiğinde zaman damgası olarak kullanılacaksa, aşağıdaki bağlantı yardımcı olabilir; alvinalexander.com/mysql/… 1. önerimde , bir mysql tablosundaki her sütun bağımsızdır. Dolayısıyla veri girişi (yukarıdaki soruda bir değişken kullanmak gibi) bağımsız olarak yapılır. Ancak,>, <, =,! = ,! <gibi operatörleri kullanarak farklı sütunlardaki verileri karşılaştırabilir ve karşılaştırabilirsiniz. Bu, basitçe bu gibi sütunlara veri giremeyeceğiniz anlamına gelir; mysql> tabloyu güncelle last_update = last_monitor = now () burada id = 1;
Wahinya Brian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.