我有一个像这样的表格架构:
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
?我更喜欢只使用一个查询,这就是我在这里问的原因。
答案 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);