gpt4 book ai didi

mysql - 设置此表中唯一的索引类型 MySQL

转载 作者:行者123 更新时间:2023-11-29 23:02:21 24 4
gpt4 key购买 nike

我在设置此表 MySQL 中唯一的索引类型时遇到问题。

在表 doTable 中,我在 MyUniqueKey 上设置了唯一的索引类型,其中包含字段 EventDateTES

我希望当 EventDateTES 已经存在时,插入查询不会被执行。

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

EventDateTES已经生效时,插入查询不会在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`;

相反,在这种情况下,即使 EventDateTESdoTable 上的字段 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com