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ますか? 私は 1 つのクエリのみを使用することを好むので、ここで質問します。

4

2 に答える 2

1

私はこの方法で問題を解決しました(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 に答える