كيف يمكنني تحديث إذا كان موجودا ، إدراج إن لم يكن (ويعرف أيضا باسم "upsert" أو "دمج") في الخلية ؟

StackOverflow https://stackoverflow.com/questions/1218905

سؤال

هل هناك طريقة سهلة INSERT على التوالي عندما لا وجود له ، أو UPDATE إذا كان موجودا ، وذلك باستخدام واحد MySQL query ؟

هل كانت مفيدة؟

المحلول

نعم، INSERT ... ON DUPLICATE KEY UPDATE . على سبيل المثال:

INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1

نصائح أخرى

أعرف أن هذا هو السؤال القديم, ولكن جوجل يؤدي بي إلى هنا مؤخرا لذا أتصور أن البعض الآخر يأتي هنا أيضا.

@الفوضى هو الصحيح:هناك INSERT ... ON DUPLICATE KEY UPDATE بناء الجملة.

بيد أن السؤال الأصلي سئل عن MySQL على وجه التحديد ، في الخلية هناك REPLACE INTO ... بناء الجملة.IMHO, هذا الأمر هو أسهل وأكثر وضوحا لاستخدام upserts.من دليل:

محل يعمل تماما مثل إدراج ، إلا أنه إذا كان قديم صف في الجدول له نفس القيمة صف جديد مفتاح أساسي أو فهرس فريد, الصف القديم حذف قبل أن يتم إدراج صف جديد.

ملاحظة هذا ليس SQL القياسية.مثال من دليل:

CREATE TABLE test (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  data VARCHAR(64) DEFAULT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)

تحرير: فقط تحذيرا عادلة REPLACE INTO ليس مثل UPDATE.كما يقول دليل, REPLACE حذف صف إذا كان موجودا ، ثم إدراج واحدة جديدة.(ملاحظة مضحك "2 الصفوف المتأثرة" في المثال أعلاه.) أنه سيتم استبدال القيم كل أعمدة من القائمة سجل (وليس مجرد تحديث بعض الأعمدة.) سلوك الخلية REPLACE INTO هو مثل الكثير من Sqlite هي INSERT OR REPLACE INTO.انظر هذا السؤال بعض الحلول إذا كنت تريد فقط إلى تحديث بعض الأعمدة (وليس كل الأعمدة) إذا كان السجل موجودا بالفعل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top