মাইএসকিউএল একই সাথে একাধিক কলাম আপডেট করুন ()


88

আমার 2 টি ডেটটাইম কলাম আপডেট করতে হবে এবং MySQL সংস্করণ 4.1.20 ব্যবহার করে সেগুলি হুবহু হওয়া উচিত। আমি এই ক্যোয়ারীটি ব্যবহার করছি:

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

এটি নিরাপদ বা এমন কি কোনও সুযোগ আছে যে কলামগুলি বিভিন্ন সময়ের সাথে আপডেট হয়, কারণ 2 টি দৃশ্যমান কল now()?
আমি মনে করি না যে এটি বিভিন্ন মান সহ আপডেট করা যেতে পারে (আমি মনে করি অভ্যন্তরীণভাবে মাইএসকিএল কলগুলি now()প্রতি সারি বা অনুরূপ কিছু হিসাবে একবার আসে) তবে আমি বিশেষজ্ঞ নই, আপনি কী ভাবেন?

আপডেট: দ্বিতীয় প্রশ্ন এখানে উত্তোলন করা হয়েছিল ।


4
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এখান থেকে আপনার দ্বিতীয় প্রশ্নটি সরিয়ে ফেলুন এবং শেষ পর্যন্ত এটি একটি আলাদা পোস্টে পোস্ট করুন।
সিউর

উত্তর:


145

একটি সমাধান খুঁজে পেয়েছি:

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

আমি দেখেছি এই মাইএসকিউএল ডক্সে এবং কয়েক পরীক্ষার এটি কাজ করে পরে:

নিম্নলিখিত বিবৃতিটি করল 2টিকে বর্তমান (আপডেট করা) কল 1 মানকে সেট করে, মূল কোল 1 মানকে নয়। ফলাফলটি যে কল 1 এবং কল 2 এর একই মান রয়েছে। এই আচরণটি স্ট্যান্ডার্ড এসকিউএল থেকে পৃথক।

T1 SET কল 1 আপডেট করুন 1 কল 1 + 1, কল 2 = কোল 1;


কোন উপায় আছে যে এটি কাজ করবে না? কোনও পদ্ধতিতে বা টেম্প টেবিলগুলির সাথে যোগদান ব্যবহার করে?
সোহেল রাহাজাজ

7

মাইএসকিএল খুব চালাক নয়। আপনি যখন একাধিক আপডেটে একই টাইমস্ট্যাম্পটি ব্যবহার করতে চান বা প্রশ্নের সন্নিবেশ করতে চান, আপনাকে একটি ভেরিয়েবল ঘোষণা করতে হবে।

আপনি যখন now()ফাংশনটি ব্যবহার করবেন , সিস্টেমটি যখনই আপনি অন্য ক্যোয়ারিতে কল করবেন তখনই বর্তমান টাইমস্ট্যাম্পটিকে কল করবে।


5

বিবৃতি কার্যকর হওয়া শুরু করলে মাইএসকিউএল প্রতি বিবৃতিতে এখন একবার () মূল্যায়ন করে। সুতরাং প্রতি বিবৃতিতে এখন একাধিক দৃশ্যমান () কল থাকা নিরাপদ।

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

আপডেট ক্যোয়ারি চালানোর আগে আপনি একটি চলকের মধ্যে এখন () এর মান সঞ্চয় করতে পারেন এবং তারপরে ক্ষেত্র last_updateএবং last_monitor

এটি নিশ্চিত করবে যে এখন () কেবল একবারই কার্যকর করা হবে এবং আপনার প্রয়োজনীয় দুটি কলামে একই মান আপডেট করা হবে।


1

আপনি টাইমস্ট্যাম্প কলামের ডিফল্ট মানটিতে নিম্নলিখিত কোডটি রাখতে পারেন: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPসুতরাং আপডেটে দুটি কলাম একই মান গ্রহণ করে।


4
আফাইক "আপডেটের সময়" সারণীতে প্রতি কলামের একটি সীমা রয়েছে, সুতরাং এটি উভয় কলামে সেট করতে পারে না।
রাদু মেরিস

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;

যাইহোক আমি মনে করি যে মাইএসকিএল now()কেবলমাত্র একবারের জন্য একবার জিজ্ঞাসা করতে যথেষ্ট চালাক ।


কিভাবে আপডেট দুটি? আপনি কি অনুমান করেন যে মাইএসকিএল এগুলি একটি বিবৃতিতে সংযুক্ত করার জন্য যথেষ্ট স্মার্ট? কারণ এটা অভয়
রাফায়েল হার্সকোভিচি 14

0

এটির 2 টি উপায় রয়েছে;

প্রথমত , আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এখন স্কেল স্টেটমেন্টে ইনজেকশন দেওয়ার আগে ভেরিয়েবল হিসাবে ঘোষণা করুন। চল বলি;

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

লজিকালি যদি আপনি লাস্ট_মনিটরের জন্য আলাদা ইনপুট চান তবে আপনি আর একটি ভেরিয়েবল যুক্ত করবেন;

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

আপনি আপনার প্রকল্পে যেভাবে ব্যবহার করছেন আপনি কেবল ততবার ব্যবহার করতে পারবেন, কেবল মাইএসকিএল বিবৃতিগুলিতেই নয় সার্ভার-সাইড স্ক্রিপ্টিং-ল্যাঙ্গুয়েজে (যেমন পিএইচপি)। মনে রাখবেন এই একই চলকগুলি অ্যাপ্লিকেশনের সম্মুখ-প্রান্তে একটি ফর্মের ইনপুট হিসাবে .োকানো যেতে পারে। এটি প্রকল্পটিকে গতিময় করে তোলে এবং স্থিতিশীল নয়।

দ্বিতীয়ত যদি এখন () আপডেটের সময় নির্দেশ করে তবে মাইএসকিএল ব্যবহার করে আপনি সারিটির সম্পত্তি টাইমস্ট্যাম্প হিসাবে ডিক্যালার করতে পারেন। প্রতিবার একটি সারি isোকানো হয় বা আপডেট সময় খুব আপডেট হয়।


তাই আপনাকে স্বাগতম। যদিও এটি সমস্যার সমাধান, এটি আসলে এই প্রশ্নের উত্তর দেয় না যা "এখনই (মাইএসকিএল বিল্ট-ইন এনও () ফাংশন ব্যবহার করে কোন সমস্যা আছে?") এই প্রশ্নের উত্তর দেয় না। এছাড়াও আপনি কোনও বাহ্যিক ভাষা ব্যবহারের পরামর্শ দিয়েছেন যা পোস্টারের উপর কোনও নিয়ন্ত্রণ নাও থাকতে পারে। আপনার ২ য় পরামর্শটি সম্পর্কে আমি অনিশ্চিত (আমার মাইএসকিএল-এর স্মৃতিচিহ্নটি বিস্তারিত নয়) তবে কিছু ডক্স / উদাহরণের লিঙ্কগুলির সাথে এটি সমর্থন করা আরও বেশি বিশ্বাসযোগ্যতা দেবে।
মার্টিন

আমার ২ য় পরামর্শে, যদি এখনই () কোনও আপডেট সংঘটিত হয় তখন টাইমস্ট্যাম্প হিসাবে ব্যবহার করতে হলে, নীচের লিঙ্কটি সাহায্য করতে পারে; আমার প্রথম পরামর্শে, মাইএসকিএল টেবিলের প্রতিটি কলাম স্বতন্ত্র। সুতরাং ডেটা ইনপুট (উপরের প্রশ্নে একটি ভেরিয়েবল ব্যবহার করার মতো) স্বাধীনভাবে করা হয়। তবে আপনি>, <, =,! =,! <অপারেটর ব্যবহার করে বিভিন্ন কলামে ডেটা তুলনা করতে এবং এর বিপরীতে করতে পারেন। এর সহজ অর্থ হ'ল আপনি এই জাতীয় কলগুলিতে ডেটা ইনপুট করতে পারবেন না; mysql> আপডেট টেবিল শেষ_আপডেট = শেষ_মনিটর = এখন () যেখানে আইডি = 1;
ওয়াহিনিয়া ব্রায়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.