Php 插入mysql时密钥冲突

Php 插入mysql时密钥冲突,php,mysql,insert-update,Php,Mysql,Insert Update,我有一个SQL代码,它插入到一个名为daily的数据库中。我定期更新每日数据库,如下所示: INSERT INTO daily (SELECT * FROM dailytemp WHERE trim(`Point`) <>'' AND trim(`Point`) IN (Select trim(`Point`) FROM `data`)); 事实上,您确实在尝试插入一行,该行的id在daily中已经存在 如果这不会造成任何引用完整性问题,则可以在dailytemp中重新生成i

我有一个SQL代码,它插入到一个名为daily的数据库中。我定期更新每日数据库,如下所示:

INSERT INTO daily 
(SELECT * FROM dailytemp 
WHERE trim(`Point`) <>'' 
AND trim(`Point`) IN (Select trim(`Point`) FROM `data`));

事实上,您确实在尝试插入一行,该行的id在daily中已经存在

如果这不会造成任何引用完整性问题,则可以在dailytemp中重新生成id,以便它们不会与dailytemp中的任何id重叠。这可能会起作用:

SET @offset =  (SELECT MAX(id) FROM daily) - (SELECT MIN(id) FROM dalytemp) +1;
UPDATE dailytemp SET id = id + @offset;
然后尝试插入


如果行可以由您描述的进程以外的另一个进程插入到daily中,或者如果出于任何原因跳过此表中的id,例如,如果列是自动递增的,则问题将再次发生。您可能希望在日常过程中包含此初步更新。

如果您不介意,一个可能的解决方案可能是使用插入前触发器和一个单独的表进行排序

序列表

创建表daily_seqid BIGINT NOT NULL AUTO_INCREMENT主键; 现在扳机

分隔符$$ 创建触发器tg_每日插入 每天插入之前 每行 开始 插入每日顺序值ll; SET NEW.id=最后一次插入\u id; 结束$$ 定界符; 现在,您可以每天插入任何需要插入的内容,id值将替换为唯一的自动递增值


这是一个演示

我决定使用一个存储过程来执行这个操作,列出所有列的列的名称而不是这个头痛的问题

感谢所有帮助过我的人。我这样做的另一个原因是,我需要为每一组插入的数据为daily表插入一个日期,所以我只为dail表创建了一个日期列

插入已创建的每日列1、列2等 从每日温度中选择col1、col2等…“mydate” 修剪“点”和修剪“点” 从“数据”中选择修剪“点”;
谢谢大家

纠正了错误。如果您发布得到的确切错误,这将有所帮助。请发布每日和dailytempi更新的表定义,请检查请确认id是主键,以及两个表上是否有唯一索引。dailytemp中如何生成id?它是一个持久化表吗?
SET @offset =  (SELECT MAX(id) FROM daily) - (SELECT MIN(id) FROM dalytemp) +1;
UPDATE dailytemp SET id = id + @offset;