好吧,我已经修改了这个问题,还包括我到目前为止所做的以及我想做的事情。所以这就是它:
CREATE ORDER (
product_nat_id int(3) NOT NULL,
name VARCHAR(20),
PRIMARY KEY (product_nate_id)
)
INSERT INTO ORDER(product_nat_id, name) VALUES(1, 'Product 1');
INSERT INTO ORDER(product_nat_id, name) VALUES(2, 'Product 2');
INSERT INTO ORDER(product_nat_id, name) VALUES(3, 'Product 3');
CREATE TABLE INT_PRODUCT (
product_id INTEGER NOT NULL AUTO_INCREMENT,
product_nat_id INTEGER NOT NULL,
title TINYTEXT,
dateCreate TIMESTAMP CURRENT_TIMESTAMP,
CONSTRAINT INT_PRODUCT_PK PRIMARY KEY (product_id),
UNIQUE INT_PRODUCT_NK (product_nat_id));
但我想要的是,每当记录到达时具有更新的值但重复的密钥,我需要插入它(并且不更新),但是根据插入的时间差异避免重复约束。希望现在有意义。
答案 0 :(得分:0)
我建议如下:
查找上一条记录。我假设你应该知道那是什么
SELECT Count(*) FROM dim WHERE recordId = '$recordid'
如果在步骤1中返回的记录大于0,则使“先前”记录无效:
UPDATE dim SET datevalid = '$datevalue' where recordId = '$recordid' and status = 2
继续执行步骤1,其中支票中的ecords返回大于0现在执行插入:
INSERT INTO dim (recordId,field1,field2,date,status) VALUES (1,'sad','123123','2013-03-26',1)
如果步骤1为假,则只需插入:
INSERT INTO dim (recordId,field1,field2,date,status) VALUES (1,'sad','123123','2013-03-26',1)
当您需要查找记录并区分有效或无效时,我会添加status
字段作为额外的度量,然后您不需要在日期之间进行过滤。然后,您可以使用status
字段。即使对于一组有效和无效记录的数据可能相同,每个记录也有一个唯一的自动增量键。在这种情况下,recordId
和唯一键不会相同。您分配recordId
,系统将在表上分配唯一键。 status = 1
有效且status = 2
无效。
希望这有帮助!
答案 1 :(得分:0)
您的帖子的示例代码如:
插入查询语法如下所示:
INSERT INTO table (primarykeycol,col1,col2)
VALUES (1,2,3) ON DUPLICATE KEY UPDATE col1=0, col2=col2+1
如果已经有一行将primarykeycol设置为1,则此查询等于:
UPDATE table SET col1=0, col2=col2+1 WHERE primarykeycol = 1
解释为:
通常要达到相同的效果,你必须发出一个 UPDATE查询,然后检查是否有受影响的行,如果没有 发出INSERT查询。
通过这种方式,您可以一步完成所有操作 - 首先尝试插入和 如果插入失败则更新。
这种语法完美的一种情况就是当你 与日常柜台合作。例如,您可能有一个表 PostID,日期和计数列。
每天您都必须检查是否已为其创建了条目 那天,如果是这样,增加计数列 - 这可以 用一个INSERT ... ON DUPLICATE KEY UPDATE查询轻松替换。
不幸的是有一些警告。一个是当你有 多个唯一索引,就好像你有一个OR条件一样 UPDATE查询的WHERE子句。
这意味着应该更新多行,但INSERT ... ON DUPLICATE KEY UPDATE只会更新一行。