作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在设置此表 MySQL 中唯一的索引类型时遇到问题。
在表 doTable
中,我在 MyUniqueKey
上设置了唯一的索引类型,其中包含字段 EventDate
和 TES
。
我希望当 EventDate
和 TES
已经存在时,插入查询不会被执行。
DROP TABLE IF EXISTS `doTable`;
CREATE TABLE `doTable` (
`EventDate` date DEFAULT NULL,
`TES` varchar(4) DEFAULT NULL,
`Dicl` int(11) DEFAULT NULL,
`AVHS` int(11) DEFAULT NULL,
`ID` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ID`),
UNIQUE KEY `MyUniqueKey` (`EventDate`,`TES`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我需要将 doTable_old
的旧行插入到 doTable
中,并尝试了以下代码:
INSERT IGNORE INTO `doTable` (
`EventDate`,
`TES`,
`Dicl`,
`AVHS`
) SELECT
`EventDate`,
`TES`,
SUM(`Dicl`),
SUM(`AVHS`)
FROM
`doTable_old`
WHERE
`EventDate` = '2015-02-05'
`TES` = 'M201';
当EventDate
和TES
已经生效时,插入查询不会在doTable
中执行。
现在我需要使用新算法更新 doTable
上的字段 Dicl
的值,我已经尝试过:
UPDATE IGNORE `doTable` A
JOIN (
SELECT
SUM(tmp0.`Dicl`) AS `Dicl`
FROM
`doTable_cons` tmp
JOIN `doTable_old` tmp0 ON tmp0.Codes = tmp.Codes
WHERE
`TES` = 'M201'
AND `EventDate` = '2015-02-05'
GROUP BY
`EventDate`
ORDER BY
`EventDate` ASC
) AS x
SET A.`Dicl` = A.`Dicl` + x.`Dicl`
WHERE
A.`TES` = x.`TES`;
相反,在这种情况下,即使 EventDate
和 TES
,doTable
上的字段 Dicl
的值也始终会更新> 已经在 doTable
上。
我的意思是,如果我在第一次更新 +2 时采用旧行 10 ,则新值为 12 ,如果我再次尝试更新值 14 ,然后更新 16 ,然后更新 18 ...应该保持在 12 。 ..但是 key 不起作用...
我错过了什么?
这段代码有什么问题?
提前谢谢您。
最佳答案
只有当您以导致重复违规的方式更改唯一键中使用的字段,或者您插入会导致违规的新记录时,重复键才会发挥作用。
对于第二个查询,您不会更改唯一键中使用的任何字段。因此,更新将继续进行,因为没有发生违规。
例如
表 X(唯一键 (x,y))
x y z
1 1 0
1 2 0
INSERT (x,y) VALUES (1,1) // fails - would create a dupe violation
INSERT (x,Y) VALUES (1,3) // succeeds - no dupe
UPDATE ... SET y=2 WHERE x=1 AND y=1 // fails - would create a dupe
UPDATE ... SET z=z+1 where x=1 AND y=1 // no problem, no dupe
换句话说,按照您的逻辑,不可能更新数据库中的任何记录,因为表上的任何更改都会造成重复键违规。这显然是完全错误的。
关于mysql - 设置此表中唯一的索引类型 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28434518/
我是一名优秀的程序员,十分优秀!