0

好吧,我已经修改了这个问题,以包括我到目前为止所拥有的以及我想要做的事情。就这样吧:

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));

但我想要的是,每当一条记录到达时带有更新的值但重复的键,我需要插入它(而不是更新),但要避免基于插入时间差异的重复约束。希望这现在有意义。

4

2 回答 2

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

解释为:

  1. 通常要获得相同的结果,您必须发出 UPDATE 查询,然后检查是否存在受影响的行,如果没有则发出 INSERT 查询。

  2. 这样,您可以一步完成所有操作——首先尝试插入,然后在插入失败时更新。

  3. 这种语法非常适合的一种情况是当您使用每日计数器时。例如,您可能有一个包含 PostID、Date 和 Count 列的表。

  4. 每天你都必须检查你是否已经为那一天创建了一个条目,如果是的话,增加计数列——这可以很容易地用一个 INSERT ... ON DUPLICATE KEY UPDATE 查询代替。

  5. 不幸的是,有一些警告。一个是当您有多个唯一索引时,它的行为就像您在 UPDATE 查询的 WHERE 子句中有 OR 条件一样。

  6. 这意味着应该更新多行,但 INSERT ... ON DUPLICATE KEY UPDATE 只会更新一行。

MySQL 手册:INSERT ON DUPLICATE KEY UPDATE 语法

于 2014-03-06T07:22:01.933 回答
0

我建议如下:

  1. 查找之前的记录。我想你应该知道那会是什么

    SELECT Count(*) FROM dim WHERE recordId = '$recordid'

  2. 如果在步骤 1 中返回的记录大于 0,则使“上一个”记录无效:

    UPDATE dim SET datevalid = '$datevalue' where recordId = '$recordid' and status = 2

  3. 继续第 1 步,其中检查中返回的记录大于 0,现在执行插入:

    INSERT INTO dim (recordId,field1,field2,date,status) VALUES (1,'sad','123123','2013-03-26',1)

  4. 如果第 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无效。

希望这可以帮助!

于 2013-03-26T06:26:00.377 回答