MySQL على إدراج مفتاح مكرر في جدول التدقيق أو السجل

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

  •  28-09-2019
  •  | 
  •  

سؤال

هل يوجد طريقة لإنجاز ذلك؟

INSERT IGNORE INTO some_table (one,two,three) VALUES(1,2,3)
ON DUPLICATE KEY (INSERT INTO audit_table VALUES(NOW(),'Duplicate key ignored')

أنا حقًا لا أريد استخدام PHP لهذا :(

شكرًا!

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

المحلول

إذا كنت تريد التفكير في استخدام إجراء مخزن ، يمكنك استخدام ملف DECLARE CONTINUE HANDLER. هذا مثال:

CREATE TABLE users (
    username    VARCHAR(30), 
    first_name  VARCHAR(30), 
    last_name   VARCHAR(30),
    PRIMARY KEY (username)
);

CREATE TABLE audit_table (timestamp datetime, description varchar(255));

DELIMITER $$
CREATE PROCEDURE add_user 
       (in_username    VARCHAR(30),
        in_first_name  VARCHAR(30),
        in_last_name   VARCHAR(30))
    MODIFIES SQL DATA
BEGIN
    DECLARE duplicate_key INT DEFAULT 0;
    BEGIN
        DECLARE EXIT HANDLER FOR 1062 SET duplicate_key = 1;

        INSERT INTO users (username, first_name, last_name)
               VALUES (in_username, in_first_name, in_last_name);
    END;

    IF duplicate_key = 1 THEN
        INSERT INTO audit_table VALUES(NOW(), 'Duplicate key ignored');
    END IF;
END$$
DELIMITER ;

دعنا نضيف بعض البيانات ، في محاولة لإدراج مفتاح مكرر:

CALL add_user('userA', 'Bob', 'Smith');
CALL add_user('userB', 'Paul', 'Green');
CALL add_user('userA', 'Jack', 'Brown');

نتيجة:

SELECT * FROM users;
+----------+------------+-----------+
| username | first_name | last_name |
+----------+------------+-----------+
| userA    | Bob        | Smith     |
| userB    | Paul       | Green     |
+----------+------------+-----------+
2 rows in set (0.00 sec)

SELECT * FROM audit_table;
+---------------------+-----------------------+
| timestamp           | description           |
+---------------------+-----------------------+
| 2010-10-07 20:17:35 | Duplicate key ignored |
+---------------------+-----------------------+
1 row in set (0.00 sec)

إذا كانت التدقيق مهمة على مستوى قاعدة البيانات ، فقد ترغب في منحها EXECUTE الأذونات فقط بحيث يمكن لمستخدمي قاعدة البيانات الخاص بك الاتصال فقط بالإجراءات المخزنة.

نصائح أخرى

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

تحرير: يمكنك استخدام الزناد أيضًا

لست متأكدًا مما إذا كان هذا سيعمل ولكن انظر إلى بيان MySQL

كود مزيف

IF(SELECT id_key_index FROM tbl WHERE id_key_index = $index) THEN (UPDATE SECOND TBL);
    ELSE
      INSERT ...
    END IF;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top