Mysql 通过一个查询插入不同语言的数据
我有这样一个表模式:Mysql 通过一个查询插入不同语言的数据,mysql,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 ; 此表包含一些可能使用不同语言的数据。因此
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
列中放置不同的值
您可以在此处检查SQLFIDLE:
是否可以更正我的表结构或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中尝试插入时,插入工作正常
您可以通过另一个只包含所需自动增量值的表来解决id问题(如果需要自动增量)。因此,您将插入到该表中,获取和id,然后在插入中使用该id。但不能使用自动增量,然后在多行上使用相同的id。如果这有意义的话…我用这种方式解决了我的问题(使用两个查询,但一个相当简单,使用函数
LAST\u INSERT\u ID()
):
您可以使用MyISAM而不是InnoDB。。。并将PK修改为(lang,id)。。。或者我误解了你的意图,我想你误解了我的意图:)PK在两种情况下都被修改为lang,id,在两种情况下,它都以相同的方式工作(不工作)。它在MyISAM中的工作方式肯定不同于在InnoDB中的工作方式-但两者都不是你想要的!谢谢你的回答。我知道我可以用另一张桌子,我只是想看看没有它是否可能。顺便说一句,我将我的结构更改为您提供的结构,但它不起作用,您能给我看一下您的小提琴吗?我只是将您的小提琴用于上面的表格结构…您会得到什么错误?它仍然是一样的,第三个添加的节点有两个不同的
id
s(3和4)您的第三个节点的id
s都是null
,这不是我的意图是的,我知道,但是由于您不能自动递增并且在多行上具有相同的id,您需要找到null问题的另一个解决方案,例如,使用另一个表跟踪某些自动递增的值,然后将其用作状态表中的id。
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);