0

现在我有一个带有自动递增 ID 号、名称和定义的表,我正在使用另一个表中的值更新表

INSERT INTO words(id, word, definition) SELECT id, word, definition FROM temp 
ON DUPLICATE KEY UPDATE words.word = temp.word, words.definition=temp.definition;

表 temp 与我正在使用的表具有相同的列布局,并且它工作正常,除非我从 temp 中间删除一个条目然后更新我的主表。例如,

temp
id  word definition
1   bob   is a cat
2   sam   is a dog
3   doug  is a monk
4   croe  is a bird

table main 设置为然后我从 temp 中删除第 2 行

temp
    id  word definition
    1   bob   is a cat
    2   doug  is a monk
    3   croe  is a bird

然后更新主表

main
id  word definition
1   bob   is a cat
2   sam   is a dog
3   croe  is a bird
4   croe  is a bird

因为 temp 现在只有 3 行,但主 HAD 4,第 4 行没有被删除。我试图通过将 word 设为唯一列来解决此问题,但现在我收到错误消息,即关键字“word”存在重复条目。那么我该如何解决呢?

4

1 回答 1

0

MySQL 手册中,

通常,您应该尽量避免对具有多个唯一索引的表使用 ON DUPLICATE KEY UPDATE 子句。

所以,你可以做的是制作word你的主键,然后去掉这个id列。这应该够了吧 :)

然后您的查询变为

INSERT INTO words(word, definition) SELECT word, definition FROM temp 
ON DUPLICATE KEY UPDATE words.word = temp.word, words.definition=temp.definition;

如果您需要任意排序,我会创建一个附加表

CREATE TABLE word_order (VARCHAR(30) PRIMARY KEY, sort_order INT)

然后当您运行查询时

SELECT words.word,
       words.definition
FROM words
JOIN word_order
ON words.word = word_order.word
ORDER BY word_order.sort_order

但是,您INSERTS变得有点复杂,您必须运行多个插入。请参阅sql-insert 在一个查询中插入多个表

此外,这篇CodeProject 文章对这个主题有更多的想法。

于 2012-12-09T23:48:08.637 回答