0

我有一个像这样的表模式:

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?我更喜欢只使用一个查询,所以我在这里问。

4

2 回答 2

1

我以这种方式解决了我的问题(通过使用两个查询,但一个相当简单并且具有函数LAST_INSERT_ID()):http ://sqlfiddle.com/#!2/b400ae/1

INSERT INTO statuses (id, lang_id, name) VALUES (null,(SELECT lang_id FROM languages LIMIT 1),'');
INSERT INTO statuses (id, lang_id, name) VALUES 
(LAST_INSERT_ID(),1,'Third'),(LAST_INSERT_ID(),2,'Trzeci'),(LAST_INSERT_ID(),3,'Terzo')
ON DUPLICATE KEY UPDATE name = VALUES(name);
于 2013-11-05T12:49:40.120 回答
0

如果您将架构更改为此:

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。如果那有意义的话...

于 2013-11-05T11:54:56.483 回答