2016-01-08 30 views
0

我有一个表称为历史记录,跟踪对另一个表进行的更改。基本的想法是能够追踪最近一次更新的具体条目。Mysql - 重复键插入一个不同的值

当我第一次插入时,它会创建一个条目,将动作字段显示为'UPLOAD'。下一次输入相同的密钥时,我需要它创建一个新的历史记录,其中的操作是'更新',这样我可以看到它何时首次创建,以及谁在那之后更新了该密钥。

不幸的是,在DUPLICATE KEY INSERT ...不是一个mysql结构。 我该怎么办?

到目前为止,我有:

INSERT INTO history (key,userID,action,note,date) 
VALUES (?,?,?,?,?) 

*如果行动的价值永远是“上载”,即使它是一个更新 **问号是从准备好的声明绑定

如果关键在于历史我需要动作来改变'更新'并创建一个新的条目 - 它不应该改变已经存在的条目。

+0

请详细说明插入副本时想要发生什么。 –

+0

你需要设置你的关键列是主键和自动更新(如1,2,4 ...) – GiapLee

+0

我编辑的问题更清晰 –

回答

3
  1. 可以使用触发器

    CREATE TRIGGER catchHim BEFORE INSERT ON myTable 
    FOR EACH ROW 
        BEGIN 
        IF EXISTS(SELECT * FROM myTable WHERE userID=NEW.userID) THEN 
         INSERT INTO history (key,userID,action,note,date) VALUES (NEW.myColumn1, NEW.myColumnForUserId, .....); 
        END IF; 
        END; 
    

但他们很难掌握的,特别是没有人使用他们在MySQL。

  1. 事实上,在进行更新之前,在PHP中验证该事物是否存在,然后决定是否插入历史记录。
+0

我正在考虑在插入之前确认它是否存在,但是我觉得它会花费太长时间从php中查询sql,(这些值来自一个巨大的Excel电子表格)。 –

+0

这是不可避免的。您可以明确地执行此操作,也可以在发送错误消息之前由数据库引擎执行。但速度很快,因为它可能是主键,因此是聚簇索引。所以不要担心。 – AlexanderMP

+0

酷!我会试一试。谢谢你的帮助! –

相关问题