Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 通过一个查询插入不同语言的数据_Mysql - Fatal编程技术网

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);