我有一个表,我将从LDAP / AD导入成千上万个用户帐户,并希望它在发现重复的情况下更新它们,以防发生更改。我正在使用自动递增的替代键作为主键,并使用“域”和“用户名”作为唯一键索引。主键用作另一个表中的外键。此外,此表还包含“位置”表中的外键。
我已经做了很多阅读,尝试和错误尝试使MySQL INSERT ... ON DUPLICATE KEY UPDATE语法起作用,但没有成功。每次尝试,都会得到相同的结果(键增加):键“ PRIMARY”的条目“ 27305”重复。请注意,表中没有使用此键的条目。
我正在将MySQL 5.6.30与PHP 5.6.21结合使用。
这是表的结构:
users
CREATE TABLE `users` (
`Userid` bigint(20) UNSIGNED NOT NULL,
`Domain` varchar(17) NOT NULL,
`Username` varchar(25) NOT NULL,
`Firstname` varchar(25) DEFAULT NULL,
`Lastname` varchar(35) DEFAULT NULL,
`Realname` varchar(60) DEFAULT NULL,
`Dept` varchar(10) DEFAULT NULL,
`Email` varchar(50) DEFAULT NULL,
`Site` varchar(3) DEFAULT NULL,
`Location` bigint(20) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `users`
ADD PRIMARY KEY (`Userid`),
ADD UNIQUE KEY `Domain` (`Domain`,`Username`) USING BTREE,
ADD KEY `Realname` (`Realname`,`Dept`) USING BTREE,
ADD KEY `Email` (`Email`),
ADD KEY `Location` (`Location`),
ADD KEY `Firstname` (`Firstname`,`Lastname`,`Dept`) USING BTREE,
ADD KEY `Firstname_2` (`Firstname`,`Lastname`,`Location`);
ALTER TABLE `users`
MODIFY `Userid` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
AUTO_INCREMENT=27306;
ALTER TABLE `users`
ADD CONSTRAINT `Location_fk` FOREIGN KEY (`Location`) REFERENCES `locations`
(`Locid`) ON UPDATE CASCADE;
这是根据PHP的插入语句:
INSERT INTO `users` (`Domain`, `Username`, `Firstname`, `Lastname`,
`Realname`, `Dept`, `Email`, `Site`, `Location`) VALUES ('americas',
'JACLEAR', 'Foo', 'Bar', 'Foo Bar', 'IT', '[email protected]', '165', '0')
ON DUPLICATE KEY UPDATE `Userid`=LAST_INSERT_ID(`Userid`),
`Domain`=`Domain`, `Username`=`Username`, `Firstname`=VALUES(`Firstname`),
`Lastname`=VALUES(`Lastname`), `Realname`=VALUES(`Realname`),
`Dept`=VALUES(`Dept`), `Email`=VALUES(`Email`), `Site`=VALUES(`Site`),
`Location`=VALUES(`Location`);
同样,我尝试更改insert语句中的几处内容,但始终会产生相同的错误。我已经尝试过诸如从语句的更新部分中删除主键和唯一键,从唯一键中删除VALUES,从主键中删除LAST_INSERT_ID之类的事情。我尝试将语句直接粘贴到SQL控制台中,但是没有这样做。无法获得更多对输出有用的信息-它返回了相同的消息:密钥“ PRIMARY”的条目重复“ 27305”
由于在SQL Console上运行该语句会返回相同的错误,因此我认为它与PHP没有任何关系。我要提到的是我正在使用PDO-> prepare()和PDOStatement-> execute()。
看起来我将不得不执行SELECT,然后根据SELECT结果执行INSERT或UPDATE,除非有人看到我在做什么错。但这会使脚本的效率降低很多。
任何帮助,将不胜感激。谢谢。
我试图在没有“ ON DUPLICATE KEY UPDATE”的情况下进行INSERT操作,并且MySQL响应了一个有用的错误,该错误实际上指出了REAL问题。它告诉我,我为外键(位置)插入的值是“违规”。之所以如此,是因为位置表中没有键0的记录。我将示例插入内容更新为使用有效的位置外键,并且该方法有效。更新成功。
简而言之,请确保您要插入有效值!;)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句