0

テーブルに行を挿入しようとしていますが、X と Y の組み合わせがテーブルにまだ存在しない場合にのみ、検索して最終的にこのクエリを思いつきましたが、何もせず、何もスローしませんエラー。

INSERT INTO `tiles` (`TileID`, `Type`, `X`, `Y`) 
 SELECT UUID(), (FLOOR(RAND() * 4)), 0, 0 FROM `tiles` 
 WHERE NOT EXISTS (SELECT 1 FROM `tiles` WHERE `X`=0 AND `Y`=0) LIMIT 1;

どんな助けでも大歓迎です。

4

2 に答える 2

1

可能な解決策は、UNIQUE制約を追加することです(x, y)

ALTER TABLE tiles ADD UNIQUE (x, y);

そして使うINSERT IGNORE

INSERT IGNORE INTO tiles VALUES (UUID(), (FLOOR(RAND() * 4)), 0, 0);
INSERT IGNORE INTO tiles VALUES (UUID(), (FLOOR(RAND() * 4)), 0, 0);

これがSQLFiddleのデモです

于 2013-07-21T05:05:49.287 に答える
1

基本的に、選択を select * from() でラップするだけで済みます。これにより、クエリが作成されます。

INSERT INTO `tiles` (`TileID`, `Type`, `X`, `Y`) 
SELECT * FROM (SELECT UUID(), (FLOOR(RAND() * 4)), 0 as x, 0 as y) as tmp
WHERE NOT EXISTS (SELECT 1 FROM `tiles` WHERE `X`=0 AND `Y`=0) LIMIT 1;

「as x」と「as y」を追加する必要があったのは、mysql が「列名 '0' の重複」について不平を言っていたからです。私の推測では、名前を明示的に書き出さないと、値を名前として使用するだけです。とにかく、このクエリは機能するはずです。また、上記のカイルのリンクには、このタイプのものに関する詳細情報があります。

于 2013-07-21T03:40:16.697 に答える