使用一个查询插入具有不同语言的数据

时间:2013-11-05 11:46:05

标签: mysql

我有一个像这样的表格架构:

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?我更喜欢只使用一个查询,这就是我在这里问的原因。

2 个答案:

答案 0 :(得分: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)。所以你插入到那个表中,get和id然后在你的插入中使用那个id。但是你不能使用auto_increment然后在几行上使用相同的id。如果这有任何意义......

答案 1 :(得分:0)

我通过这种方式解决了我的问题(通过使用两个查询,但一个相当简单且使用函数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);