我有一个这样的表架构:

CREATE TABLE statuses
    (
     id int,
     lang int,
     name varchar(30)
    );

ALTER TABLE `statuses` ADD PRIMARY KEY (`id`, `lang`) ;
ALTER TABLE  `statuses` CHANGE  `id`  `id` INT NOT NULL AUTO_INCREMENT ;


该表包含一些可能使用不同语言的数据。因此,我希望对应于相同数据但不同语言的每一行具有相同的id但不同的lang。这样,双键是唯一的。我想使用以下查询来插入和更新值。

INSERT INTO statuses (id, lang, name)
VALUES (null,1,'Third'),(null,2,'Trzeci')
ON DUPLICATE KEY UPDATE name = VALUES(name)


如果我想更新值,它可以正常工作,但是当我要实际插入内容时,它会中断,因为自动递增功能会为每个新创建的行在id列中放置不同的值。

在这里您可以检查SQLfiddle:http://sqlfiddle.com/#!2/62fbfd/1

是否可以更正我的表结构或sql查询来完成这项工作,还是我应该首先使用多个查询来插入第一行以表示新的id,然后再使用此新创建的id插入其余的行? ?我更喜欢只使用一个查询,所以这就是为什么在这里询问。

最佳答案

如果将模式更改为此:

CREATE TABLE statuses
(
 id int,
 lang int,
 name varchar(30)
);

ALTER TABLE `statuses` ADD UNIQUE INDEX (`id`, `lang`) ;

ALTER TABLE  `statuses` CHANGE  `id`  `id` INT;


那会做你想要的吗?当我在您的sqlfiddle中尝试插入时,插入起作用了。

您可以通过拥有另一个仅包含所需auto_increment值的表来解决id问题(如果需要auto_increment)。因此,您将插入表,获取和ID,然后在插入中使用该ID。但是您不能使用auto_increment,然后在多个行上使用相同的ID。如果那有意义的话...

10-05 18:37
查看更多