2016-09-22 32 views
0

わかりましたので、私は私のproduct_to_store表に次のような構造を持っている:同じテーブルからテーブル内の1つの列から同じ列に挿入し、複数の行

+----------------------+--------------------+ 
| product_id - int(11) | store_id - int(11) | 
+----------------------+--------------------+ 
+----------------------+--------------------+ 
| 1000     | 0     | 
| 1000     | 6     | 
| 1005     | 0     | 
| 1010     | 0     | 
| 1010     | 6     | 
... 

は基本的に、私は価値のstore_idを持っている必要がありますproduct_idの場合は6です。たとえば、IDが1005の製品(product_id)は、store_idのレコードが0のレコードのみです。 product_id6に等しい別のレコード/行が必要です。 ID 10001010の商品は、どちらも同じようなものです(store_idのレコードは6と同じです)。

私だけproduct_idが設定されている新しい行を挿入順に次のクエリを実行しようとした:

INSERT INTO `product_to_store` 
     (product_id) SELECT `product_id` 
        FROM `product_to_store` 
        WHERE product_id != 6 

そしてstore_id6の値を持つnullあるすべての行を更新するために、別のクエリを実行することを検討します。しかし、私は得る:

#1062 - Duplicate entry '1000-0' for key 'PRIMARY'

PHPでループを使用しなくても、これを実現できる方法はありませんか、むしろ実用的ではありませんか?

+0

のSTORE_IDで製品が存在しない製品を挿入したいです。このエラーから、 'product_id'は主キーであり、同じ' product_id'を持つ重複行は許可されません –

+1

@ e-nekoこれは製品と店舗間のクロステーブルのように見えるので、一意のキーはおそらくProduct_id &Store_Id – Matt

答えて

2
INSERT INTO `product_to_store` (product_id,store_id) 
SELECT DISTINCT p1.product_id, 6 as store_id 
FROM 
    product_to_store p1 
    LEFT JOIN product_to_store x 
    ON p1.product_id = x.product_id 
    AND x.store_id = 6 
WHERE 
    x.product_id IS NULL; 

http://sqlfiddle.com/#!9/01ac7a

+0

私はそれを試しましたが、クエリにすでにそのような行が挿入されているので、 '#1062 - キー 'PRIMARY''の重複エントリ' 1005-6 'が表示されます。私はまた、テーブルを別のテーブルにコピーしてからSELECTを行ってみました。 – Arcone

+1

ありがとうございます!正常に動作します。私は答えを受け入れたが、悲しいことにそれをアップヴォートすることができない。 – Arcone

+0

それは奇妙ですが、私はsqlfiddleでそれを試してみると重複した項目を持っています –

1

あなたは基本的には、すでにあなたのスキーマを添付してください6.

INSERT INTO `product_to_store` (product_id,store_id) 
SELECT DISTINCT product_id, 6 as store_id 
FROM product_to_store p1 
WHERE NOT EXISTS (SELECT 1 FROM product_to_store p2 WHERE p2.store_id = 6 
        AND p2.product_id = p1.product_id) 
+0

私はちょうど私の答えでこれでキャッチしましたが、product_idはproduct_to_storeに1回以上表示することができるのでDISTINCTが必要です。しかし、次の質問はどうしてなぜ存在しないのですか?どこにstore_id!= 6が問題を複雑にするように思われるか... – Matt

+0

DISTINCTは製品(1000,6)、(1005、 6)、(1010,6)しかし(1000,6)、(1010,6)はすでに存在しているため、主キーでは失敗します。 存在しない(1005,6)は存在しないため(1005,6)戻ります。 –

+1

http://sqlfiddle.com/#!9/de6737ここでは、 DISTINCTを指定すると、distinctを取り出し、1005を2回挿入しようとすると失敗することがわかります。これは、(1005,1)を行として追加したためです – Matt

関連する問題