MySQL على إدراج مفتاح مكرر في جدول التدقيق أو السجل
-
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;
لا تنتمي إلى StackOverflow